0

考虑我有以下课程ViewModels

public class Address
{
    public String Street { get; set; }
}

public class Person()
{
    public Address Address { get; set; }
}

如果我有一个 View which Model is Person,我可以这样做:

@Html.EditorFor(model => model.Address.Street)

生成的输入名称将是Address.Street,当我将其发布到 Action 时,默认模型绑定器能够意识到输入的名称Address.Street实际上是指 propertyStreet内的属性Address

这很好用。

但是,当我尝试使用它时遇到问题:

this.Url.Action("MyAction", myPerson)

我希望 Url 序列化程序能够像这样构建一个 queryString:/person/edit?Address.Street=X但它实际上并没有序列化该Address属性。

我可以做些什么来使 Url 序列化程序在这种情况下工作吗?

4

1 回答 1

1

我认为它没有默认解决方案,因为 Url.Actoin 在内部从您指定的对象(在您的情况下为 myPerson)创建 RouteValueDictionary。并且 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);
            }
        } 
    }

作为地址的结果,您得到以下对 { "Address", person.Address } 最后路由只需将值转换为字符串并将其添加到查询字符串中,作为查询字符串的结果,您得到 ?Adress=[person.Address.ToString( )])

我认为最简单的方法是编写一个助手,它将以您需要的方式从对象构建 RouteValueDictionary。

于 2012-09-03T16:25:23.677 回答