当前位置:  开发笔记 > 后端 > 正文

嵌套属性的模型绑定在asp.net mvc中

如何解决《嵌套属性的模型绑定在asp.netmvc中》经验,为你挑选了2个好方法。

我想在我的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属性.任何人都可以告诉我这是否应该使用默认的模型绑定器,我做错了什么或者如果它不起作用,我需要滚动我自己的代码来绑定模型对象上的嵌套属性?



1> tvanfosson..:

我认为问题是由于属性上的Name前缀.我认为您需要将其更新为两个模型并指定第二个模型的前缀.请注意,我已从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 );
 }



2> Matija Grcic..:

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

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

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有