【问题标题】:Model binding of nested properties in asp.net mvcasp.net mvc中嵌套属性的模型绑定
【发布时间】:2013-06-12 20:58:09
【问题描述】:

我想让一些绑定在我的 mvc 应用程序中工作。我发现嵌套属性不会被 asp.net mvc 的 RC1 版本中的默认模型绑定器自动绑定。我有以下类结构:

public class Contact{  
    public int Id { get; set; }  
    public Name Name { get; set; }  
    public string Email { get; set; }  
}

其中Name定义为:

public class Name{  
    public string Forename { get; set; }  
    public string Surname { get; set; }  
}

我的观点是这样定义的:

using(Html.BeginForm()){  
    Html.Textbox("Name.Forename", Model.Name.Forename);  
    Html.Textbox("Name.Surname", Model.Name.Surname);  
    Html.Textbox("Email", Model.Email);  
    Html.SubmitButton("save", "Save");  
}

我的控制器动作定义为:

public ActionResult Save(int id, FormCollection submittedValues){  
    Contact contact = get contact from database;  
    UpdateModel(contact, submittedValues.ToValueProvider());  

    //at this point the Name property has not been successfully populated using the default model binder!!!
}

Email 属性已成功绑定,但 Name.ForenameName.Surname 属性未绑定。谁能告诉这是否应该使用默认模型绑定器工作,我做错了什么,或者它是否不起作用,我需要滚动自己的代码来绑定模型对象上的嵌套属性?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    我认为问题是由于属性上的名称前缀。我认为您需要将其更新为两个模型并指定第二个模型的前缀。请注意,我已从参数中删除了 FormCollection,并使用了依赖于内置值提供程序的 UpdateModel 签名并指定了要考虑的属性白名单。

     public ActionResult Save( int id )
     {
         Contact contact = db.Contacts.SingleOrDefault(c => c.Id == id);
    
         UpdateModel(contact, new string[] { "Email" } );
         string[] whitelist = new string[] { "Forename", "Surname" };
         UpdateModel( contact.Name, "Name", whitelist );
     }
    

    【讨论】:

    • SingleOrDefault 可以直接用 lamda 表达式调用
    【解决方案2】:

    在 POST 上绑定一个名称而不是整个视图模型是指示模型绑定器将使用一个前缀。这是使用 BindAttribute 完成的。

    public ActionResult AddComment([Bind(Prefix = "Name")] Name name)
    {
      //do something
    }
    

    【讨论】:

      【解决方案3】:

      这很有趣,因为如果你这样做了

      public ActionResult Save( int id, Contact contact )
      {
          //contact here would contain the nested values.
      }
      

      我使用它取得了巨大的成功。 我想你可以以某种方式将两个联系人对象同步在一起。

      我会认为 UpdateModel 和参数绑定在幕后使用相同的调用。注意:尚未尝试重现您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 2013-09-16
        • 2014-07-10
        • 1970-01-01
        相关资源
        最近更新 更多