2012-09-03 19 views
0

考慮,我有以下類作爲ViewModels如何使Url.Action方法序列化內部屬性?

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,當我發佈到一個動作,默認的模型綁定器能夠認識到,名稱爲Address.Street的輸入實際上是指在屬性Address內的屬性Street

這工作正常。

不過,我有一個問題,當我嘗試使用此:

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

我希望網址串行打造這樣將queryString:/person/edit?Address.Street=X但它實際上簡化版,序列化Address財產。

有什麼我可以做的,使Url序列化器在這種情況下工作?

+0

如果Address.Street爲空白,則在對象序列化時默認不會包含它。 – user1751825

回答

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); 
      } 
     } 
    } 

而作爲結果的地址,你得到下面的一對{「地址」,person.Address} 最後路線只是轉換值的字符串,並將其添加到查詢字符串和結果在查詢字符串你得到嗎?Adress = [person.Address.ToString()])

我認爲最簡單的方法是寫一個幫助器,它將從你需要的方式構建RouteValueDictionary對象。

+0

不幸的是,這是解決方案。幸運的是,我可以爲Url.Action2(示例名稱)創建一個HtmlHelper,將我的對象轉換爲RouteDataDictionary並調用UrlHelper.GenerateUrl()傳遞適當的參數。 –