2013-08-21 62 views
0

我有一個標準的HTML表單POST請求與一個參數。ASP MVC - 自動分析json字符串表單變量到模型

表單數據:

model:{"Id":"2901179e-553e-4c9c-8c5c-281822ff2d11","Name":"T1","Sessions":[{"Id":"","Type":5,"Version":null,"Name":"","BestLapPoints":null,"TimeOfDayMins":1080,"hours":18,"minutes":0,"MaxLaps":null,"DurationMins":null,"Description":"","Points":[]},{"Id":"","Type":7,"Version":null,"Name":"","BestLapPoints":null,"TimeOfDayMins":1200,"hours":20,"minutes":0,"MaxLaps":null,"DurationMins":null,"Description":"","Points":[{"Position":1,"Points":10},{"Position":2,"Points":8},{"Position":3,"Points":6},{"Position":4,"Points":5},{"Position":5,"Points":4},{"Position":6,"Points":3},{"Position":7,"Points":2},{"Position":8,"Points":1}]}]} 

這是一個JSON序列對象映射到一個MVC模型類。

我想配置控制器操作取模型作爲參數從表單「模式」可變JSON字符串自動反序列化到特定模型類

[HttpPost] 
public ActionResult DoSomething(DomainModel model) 
    { 
    } 

我也想避免爲該模型編寫一個自定義模型綁定器,而不是有一些通用的,可用於任何類似的場景。

任何想法?

感謝, 斯特沃

+1

只要正確設置請求「Content-Type」,就會自動發生。 – SLaks

+0

它不會,即使我將請求內容類型重寫爲json(我得到一個異常,它無法將'model'反序列化爲json,這是有道理的)。請注意,帖子正文是** not ** json,它的格式是鍵值對:_parameterName:'string(json)value'_ – user1275154

回答

0

您可以使用自己的自定義模型綁定:

public class CustomModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){ 

     // Here you can process request body, that how you want 
     HttpRequestBase request = controllerContext.HttpContext.Request; 

     // Return your model 
     return new CustomModel{ ... }; 

    } 
} 

然後你就可以在的Application_Start這個模型綁定綁定到你的模型:

protected void Application_Start() 
{ 
    ... 
    ModelBinders.Binders.Add(typeof(CustomModel), new CustomModelBinder()); 
} 

或者你可以在ActionResult中直接設置Model binder:

public ActionResult YourAction([ModelBinder(typeof(CustomModelBinder))] CustomModel model){ 
    ... 
}