我想在我的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.Forename
或Name.Surname
属性未绑定。任何人都可以告诉我这是否应该使用默认的模型绑定器,我做错了什么或者它不起作用,我需要滚动自己的代码来绑定模型对象上的嵌套属性?
答案 0 :(得分:9)
我认为问题是由于属性上的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 );
}
答案 1 :(得分:5)
在POST上绑定Name而不是整个视图模型是指示模型绑定器将使用前缀。这是使用BindAttribute完成的。
public ActionResult AddComment([Bind(Prefix = "Name")] Name name)
{
//do something
}
答案 2 :(得分:4)
这非常有趣,因为如果你已经完成了
public ActionResult Save( int id, Contact contact )
{
//contact here would contain the nested values.
}
我正在使用它取得了巨大的成功。 我想你可以以某种方式同步两个Contact对象。
我原以为UpdateModel和参数的绑定在幕后使用相同的调用。注意:没有尝试重现您的问题。