考虑我有以下类ViewModels
public class Address
{
public String Street { get; set; }
}
public class Person()
{
public Address Address { get; set; }
}
如果我有一个查看哪个模型是Person
,我可以这样做:
@Html.EditorFor(model => model.Address.Street)
结果输入名称为Address.Street
,当我将其发布到Action时,默认模型绑定器能够意识到名称为Address.Street
的输入实际上是指属性{{ 1}}在属性Street
内。
工作正常。
但是,当我尝试使用它时,我遇到了问题:
Address
我希望Url序列化程序像这样构建一个queryString:this.Url.Action("MyAction", myPerson)
但它实际上不会序列化/person/edit?Address.Street=X
属性。
我有什么办法可以让Url序列化程序在这种情况下工作吗?
答案 0 :(得分:1)
我认为没有默认解决方案,因为Url.Actoin在内部从您指定的对象创建RouteValueDictionary(在您的情况下是myPerson)。并且RouteValueDictionary使用以下方法填充键/值对:
private void AddValues(object values) {
if (values != null) {
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(values);
foreach (PropertyDescriptor prop in props) {
object val = prop.GetValue(values);
Add(prop.Name, val);
}
}
}
作为地址的结果,你得到以下对{“地址”,person.Address} 最后路由只是将值转换为字符串并将其添加到查询字符串中,结果是查询字符串得到了吗?Adress = [person.Address.ToString()])
我认为最简单的方法是编写一个帮助程序,它将以您需要的方式从对象构建RouteValueDictionary。