MVC2 ModelBinder没有绑定到模型的'id'属性

时间:2011-03-17 08:59:36

标签: entity-framework asp.net-mvc-2 modelbinders

我有一个名为Project的模型,它具有以下属性(为简洁起见而简化)。

[DataContract(IsReference = true)]    
public class Project
{
    [Key]
    [DataMember]
    public int id { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public DateTime CreatedDate { get; set; }
}

该模型也是使用Entity Framework 4查询数据存储区的WCF服务的数据收集。模型的代码是从模板生成的,该模板根据实体框架模型自动生成CRUD服务层。

现在,我的MVC2应用程序有一个包含编辑字段的表单的视图。控制器Edit动作在POST时接受整个模型作为参数。

[HttpPost]      
public ActionResult Edit(Project project)       
{           
    var context = new ServiceContext();             
    try             
    {
        if (ModelState.IsValid)
        {
            project = context.UpdateProject(project);
            return RedirectToAction("Index");
        }           
    }           
    catch   
    {
        ModelState.AddModelError("", "Could not save project");             
    }

    return View(project);       
}

现在,我的问题是当表单发布到控制器时,Project模型的所有字段都正确填充之外的'id'属性,默认为0。

我已经做了一些挖掘,并请求谷歌叔叔寻求答案,但我能得到的最接近的修复是将以下内容添加到模型的类中,

[Bind(Include="id")]

工作正常,但只填充'id'属性,这意味着我必须明确指定要包含在模型绑定中的每个属性。显然,这可能会变得令人讨厌,特别是因为模型本身具有许多以上的属性,而不是我上面显示的属性。

还有其他方法让这个工作吗?

直觉是[Key]属性与它有关,但我无法弄清楚。

表单有'id'属性的隐藏输入。

<%: Html.HiddenFor(model => model.id)%>

2 个答案:

答案 0 :(得分:1)

尝试为ID添加其他隐藏字段,例如&lt;%:Html.HiddenFor(model =&gt; model.Id)%&gt;

答案 1 :(得分:0)

我想我找到了解决方案。

我的模型还有一些复杂的属性,它们映射到我的实体框架模型中的相关表。现在,由于我使用自跟踪实体T4模板来生成我的服务层,因此在将值映射到实体时,它有一些额外的逻辑。在这种情况下,复杂属性之一是名为Status的类,如下所示:

public class Status
{
    public int ProjectId { get; set; }
    public int StatusId { get; set ; }
}

ProjectId是我的数据存储区中Project表的外键。我注意到在模型绑定期间ProjectId字段也设置为0。

当我在视图中添加以下内容时

<%: Html.HiddenFor(model => model.Status.ProjectId) %>

这两个字段都有正确的值发布到控制器。

问题解决了:))

感谢 swapneel ,感谢您对此事的看法。