我尝试为单个操作方法覆盖默认模型绑定器。不幸的是,当我使用ajax post请求调用它时,控制器的上下文对象不包含模型的数据。 这是我的js代码:
$http.post(url.GetProducts, { productSearchViewModel: model.criteria) }).success(function(data, status) {
if (data.Error == null) {
// some code
}
}).finally(function() {
// some code
});
我的控制器操作方法:
[HttpPost]
[AuthorizeOperation(OperationName = "GetProducts")]
public ActionResult GetProducts([JsonBinder]ProductViewModel productSearchViewModel)
{
if (ModelState.IsValid)
// some code
}
自定义模型绑定器代码:
public class JsonBinderAttribute : CustomModelBinderAttribute
{
public override IModelBinder GetBinder()
{
return new JsonModelBinder();
}
public class JsonModelBinder : IModelBinder
{
public object BindModel(
ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
try
{
var json = controllerContext.HttpContext.Request
.Params[bindingContext.ModelName];
if (String.IsNullOrEmpty(json))
return null;
// Swap this out with whichever Json deserializer you prefer.
return Newtonsoft.Json.JsonConvert
.DeserializeObject(json, bindingContext.ModelType);
}
catch
{
return null;
}
}
}
}
删除JsonBinder属性后,将正确填充productSearchViewModel值。如果我离开并调试它,BindModel方法中的json总是为空。
任何想法我做错了什么?
谢谢!