3

我想使用相同的视图来编辑博客文章并添加博客文章。但是,我遇到了该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对应方法不同。

感谢您的帮助!让我知道如果你找到一个更好的方式来完成这项工作。我唯一不满意的部分是接受一个不必要的变量来使方法签名不同。

回答

2

有几个选项:

  • 让您Id财产Nullable和检查HasValue
  • 将某种mode指标添加到您的ViewData并根据值显示隐藏字段。
  • 将表单的正文放在部分视图中,并将其包含在两个不同的视图中,一个视图和一个没有隐藏视图的视图。
2

我在我的项目所做的是以下几点:

  • 有编辑独立的动作和视图并将沿编辑URL对象的ID,而不是在一个隐藏字段
  • 通行证
  • 使用共享的模板编辑器为对象,以避免写相同的样板代码两次

如果你这样做正确的添加和编辑的意见将是非常小的。

+3

为什么使用单独的控制器进行编辑和添加?这些似乎应该是* same *控制器的单独操作。 – 2011-02-16 23:54:46

+0

哎呀!这是一个错字。我的意思是单独行动。我有两个动作而不是一个,因为编辑和添加使用LINQ to Entities时需要一些不同的代码。在添加动作中,我可以在方法的参数中直接建模绑定到对象。在编辑操作中,我需要先拉起实体,然后使用`UpdateModel`方法。 – 2011-02-17 01:39:35

相关问题