我想使用相同的视图来编辑博客文章并添加博客文章。但是,我遇到了该ID的问题。添加博客文章时,我不需要发布ID值。当模型绑定将表单值绑定到控制器中的BlogPost
对象时,它将自动生成实体框架实体中的ID。使用相同表单添加和编辑的ASP.net MVC 2.0
当我编辑博客文章时,我需要一个隐藏的表单字段来存储该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是要知道,如果我编辑博客中或添加一个,因为当我加入的话,会为空,因为它不是招”的好方法尚未创建。出现错误并且实体无效时会出现问题。当控制器在无效模型后呈现表单时,Model != null
的计算结果为false,尽管我们正在编辑帖子,并且显然有一个模型。如果在添加帖子时为ID提供隐藏的输入字段,则会出现错误,指出ID不能为空。
任何帮助表示赞赏。
编辑:我跟OJ回答了这个问题,但是我发现了一些让我感到无聊的东西,我想分享它,以防万一任何人有类似的问题。添加/编辑博客的页面甚至不需要隐藏的ID字段。原因是因为当我去添加一个博客时,我对这个相对URL做了一个GET BlogProject/Admin/AddBlogPost
这个URL不包含一个ID,action方法只是呈现页面。添加博客文章时,该页面会对相同的URL进行POST。传入的BlogPost
实体由模型绑定填充,并具有一个空ID,在保存更改期间将由EF生成该ID。
现在编辑博客文章的网址时是BlogProject/Admin/EditBlogPost/{Id}
此URL包含博客文章的id,因为页回发到网址完全相同的ID去与POST到执行编辑的操作方法。
我遇到的唯一问题是操作方法不能具有相同的签名。
[HttpGet]
public ViewResult EditBlogPost(int Id)
{
}
[HttpPost]
public ViewResult EditBlogPost(int Id)
{
}
如果您尝试使用上述两种方法,编译器会对您大叫。在做一个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变量通过模型与Request.Form
将是默认的相同的内容绑定填补。您不必将此集合用于UpdateModel()
或TryUpdateModel()
,但我只是这么做的,所以我不觉得这个集合是毫无意义的,因为它实际上只是使方法签名与GET对应方法不同。
感谢您的帮助!让我知道如果你找到一个更好的方式来完成这项工作。我唯一不满意的部分是接受一个不必要的变量来使方法签名不同。
为什么使用单独的控制器进行编辑和添加?这些似乎应该是* same *控制器的单独操作。 – 2011-02-16 23:54:46
哎呀!这是一个错字。我的意思是单独行动。我有两个动作而不是一个,因为编辑和添加使用LINQ to Entities时需要一些不同的代码。在添加动作中,我可以在方法的参数中直接建模绑定到对象。在编辑操作中,我需要先拉起实体,然后使用`UpdateModel`方法。 – 2011-02-17 01:39:35