2012-06-08 44 views
2

假設我有一個ASP.NET MVC 3控制器,看起來像這樣如何以x-www-form-urlencoded格式對模型進行編碼,以便ASP.NET MVC操作可以使用它?

public class MyController : Contoller 
{ 
    public ActionResult Edit(MyModel model) 
    { 
     /* doing some stuff with the model */ 
    } 
} 

這個模型看起來像這樣

public class MyModel 
{ 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 
    public ThatModel Property1 { get; set; } 
    public List<ThisModel> BunchOfThisModel { get; set; } 
} 

public class ThatModel 
{ 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 
    public string Property3 { get; set; } 
    public string Property4 { get; set; } 
    public string Property5 { get; set; } 
    public string Property6 { get; set; } 
} 

public class ThisModel 
{ 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 
} 

不ASP.NET MVC或.NET(V4是確定的,V4。 5)不提供任何內置的方式來編碼模型(在這種情況下稱爲MyModel),以便它可以以表單url編碼(又名x-www-form-urlencoded)的形式發送到一個動作中?一個例子是「property1 = abc & property2 = def」。但是,在將請求解碼回模型時,ASP.NET MVC有自己的方法來處理嵌套模型等。假設我使用自.NET 1.1以來提供的WebRequest/WebResponse API來模擬瀏覽器。

從本質上說,我想建立的測試要求,以驗證

  1. 一些數據被排除通過有約束力的,如果需要的話
  2. 防僞造標記設置,如果需要的話
  3. 惡意數據相應處理

注意:ASP.NET Web API在此階段未被使用。因爲我正在爲現有應用程序編寫(集成)測試,因此將模型作爲JSON,XML或其他替代格式發送不適用於該問題。

回答

0

我希望我已經正確地理解了這個問題,但是假設您'將這些數據(來自JSON?)POST',那麼它可以使用最佳猜測過程來建立模型。

屬性名稱匹配,因此,如果您發送的(猜測重複Property1實際上是Property3這裏)

{ 
    Property1="this", 
    Property2="that", 
    Property3={Property1="this3", ....}, 
    BunchOfThisModel=[{Property1="bunchthis"},{....}] 
} 

這將填充您的POCO與任何名稱相匹配。如果你遺漏了一個物業(即物業2),那麼它的價值就是default(T)。在GET請求中發送你的對象模型會複雜得多,你可以base64 JSON字符串,然後在服務器上解析它是流行的方法,但鑑於它是一個複雜的模型,POST可能最適合你的意圖。

您也可以使用一個CustomBinder(一個good article is here)。您還可以使用BindAttribute和Exclude/Include選項來控制綁定到POCO對象的屬性。

希望我沒有理解錯了,這證明是有用:)

+0

我感興趣的是如何序列化的模型,因此它可以在被髮送到服務器「X WWW的形式,進行了urlencoded」格式由ASP.NET MVC Action處理,類似於將數據發佈到該操作的瀏覽器表單,而不必更改服務器。也許我的問題有點不清楚。 – bloudraak

+0

啊,是的 - 抱歉誤會了:)再次誤解它的風險......你可以直接使用FormCollection屬性嗎? – leon

+0

我認爲你正朝着正確的方向前進。問題是如何將一個模型序列化到客戶端的FormCollection中,以便它可以在服務器上反序列化爲該模型。一旦知道我可以弄清楚如何將FormCollection轉換爲「x-www-form-urlencoded」請求。 – bloudraak

相關問題