如何使Url.Action方法序列化内部属性?

时间:2012-09-03 14:30:32

标签: .net asp.net-mvc

考虑我有以下类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序列化程序在这种情况下工作吗?

1 个答案:

答案 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。