gpt4 book ai didi

c# - ASP.net MVC 2.0 使用相同的表单进行添加和编辑

转载 作者:行者123 更新时间:2023-11-30 15:45:38 26 4
gpt4 key购买 nike

我想使用相同的 View 来编辑博客文章和添加博客文章。但是,我对 ID 有疑问。添加博客文章时,我不需要发布 ID 值。当模型绑定(bind)将表单值绑定(bind)到 Controller 中的 BlogPost 对象时,它将自动生成 Entity Framework 实体中的 ID。

当我编辑博客文章时,我确实需要一个隐藏的表单字段来存储 ID,以便它与下一篇表单文章一起出现。这是我现在的观点。

<% using (Html.BeginForm("CommitEditBlogPost", "Admin"))
{ %>
<% if (Model != null)
{ %>
<%: Html.HiddenFor(x => x.Id)%>
<% } %>
Title:<br />
<%: Html.TextBoxFor(x => x.Title, new { Style = "Width: 90%;" })%>
<br />
<br />
Summary:<br />
<%: Html.TextAreaFor(x => x.Summary, new { Style = "Width: 90%; Height: 50px;" }) %>
<br />
<br />
Body:<br />
<%: Html.TextAreaFor(x => x.Body, new { Style = "Height: 250px; Width: 90%;" })%>
<br />
<br />
<input type="submit" value="Submit" />
<% } %>

现在检查模型是否为 NULL 是了解我是在编辑博文还是添加博文的好方法,因为当我添加博文时它将为空,因为它尚未创建.当出现错误且实体无效时,问题就出现了。当 Controller 在无效模型之后呈现表单时,Model != null 评估为 false,即使我们正在编辑帖子并且显然有一个模型。如果我在添加帖子时呈现 ID 的隐藏输入字段,我会收到一条错误消息,指出 ID 不能为空。

编辑

我接受了 OJ 对这个问题的回答,但是我发现了一些让我觉得很愚蠢的东西,我想分享它以防万一有人遇到类似的问题。添加/编辑博客的页面甚至不需要 id 的隐藏字段。原因是因为当我去添加一个博客时,我对这个相对 URL BlogProject/Admin/AddBlogPost

做了一个 GET

此 URL 不包含 ID,操作方法只呈现页面。该页面在添加博客文章时对同一 URL 执行 POST。传入的 BlogPost 实体由模型绑定(bind)填充,并具有一个空 ID,该 ID 将在保存更改期间由 EF 生成。

现在编辑博客文章时,URL 是 BlogProject/Admin/EditBlogPost/{Id}。此 URL 包含博客文章的 ID,并且由于页面正在回发到完全相同的 URL,因此该 id 与 POST 一起发送到执行编辑的操作方法。

我遇到的唯一问题是操作方法不能具有相同的签名。

[HttpGet]
public ViewResult EditBlogPost(int Id)
{

}

[HttpPost]
public ViewResult EditBlogPost(int Id)
{

}

如果你尝试使用上面的这两种方法,编译器会骂你的。在执行没有操作或 Controller 参数的 Html.BeginForm() 时,Id 将被回发太方便了。因此,我没有更改 POST 方法的名称,而是修改了参数以包含 FormCollection

像这样:

[HttpPost]
public ViewResult EditBlogPost(int Id, FormCollection formCollection)
{
// You can then use formCollection as the IValueProvider for UpdateModel()
// and TryUpdateModel() if you wish. I mean, you might as well use the
// argument since you're taking it.
}

formCollection 变量通过模型绑定(bind)填充,其内容与 Request.Form 默认情况下相同。您不必将此集合用于 UpdateModel()TryUpdateModel() 但我这样做只是为了让我不觉得该集合毫无意义,因为它确实是只是为了使方法签名与其 GET 对应物不同。

如果您找到更好的方法来完成这项工作,请告诉我。我唯一犹豫不决的部分是采用一个不必要的变量来使方法签名不同。

最佳答案

几个选项:

  • 将您的 Id 属性设置为Nullable 并检查 HasValue
  • 向您的 ViewData 添加某种mode 指示器,并根据值显示 Hidden 字段。
  • 将表单的主体放在局部 View 中,并将其包含在两个不同的 View 中,一个带有隐藏字段,一个不带隐藏字段。

关于c# - ASP.net MVC 2.0 使用相同的表单进行添加和编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5023513/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com