我有一个看起来像这样的动作:
[Post]
[PopulateModelFromId]
public ActionResult ChangeName( string name, MyModel model )
{
try
{
model.changeName
return JSONSuccess();
}
catch( ModelUpdateException )
{
return JSONFail();
}
}
名称和模型ID由ajax POST发送,模型由自定义操作过滤器填充,该过滤器获取id并从数据库中检索模型。
actionfilter看起来像这样:
...
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
// parse the id from the request
MyModel model = getModelFromDataStoreById( id );
filterContext.ActionParameters["model"] = model;
}
...
问题是MyModel对象没有无参数构造函数,并且MVC在ActionFilter被调用之前尝试创建并绑定到MyModel对象,但抛出异常,因为它无法实例化MyModel对象。
我的第一个问题是我是否正确地执行此操作,还是应该使用HttpContext.Items之类的东西在过滤器和操作之间传输数据?第二,有没有办法告诉MVC不要尝试绑定MyModel对象,因为它将在以后创建?
答案 0 :(得分:2)
自定义模型绑定器似乎比自定义操作过滤器更适合此任务:
public class MyModelBinder : DefaultModelBinder
{
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
var id = bindingContext.ValueProvider.GetValue("id");
if (id != null)
{
return GetModelFromDataStoreById(id.AttemptedValue);
}
return base.CreateModel(controllerContext, bindingContext, modelType);
}
}
yuo将在Application_Start
注册:
ModelBinders.Binders.Add(typeof(MyModel), new MyModelBinder());
现在您的控制器操作可能如下所示:
[HttpPost]
public ActionResult ChangeName(string name, MyModel model)
{
try
{
model.ChangeName();
return JSONSuccess();
}
catch (ModelUpdateException)
{
return JSONFail();
}
}