您可以为相应的视图模型编写自定义模型绑定器:
public class MyViewModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
bindingContext.ModelName = "some_prefix";
return base.BindModel(controllerContext, bindingContext);
}
}
您可以在 Application_Start 中注册并与您的视图模型相关联:
ModelBinders.Binders.Add(typeof(MyViewModel), new MyViewModelBinder());
在这个例子中,我已经硬编码了前缀,但是你可以让模型绑定器更通用和可重用,并考虑到BindAttribute,你可以用它来装饰你的视图模型:
public class MyViewModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// TODO: cache the result of this LINQ query to
// avoid using reflecting on each request. After all
// the metadata of the view model won't change at runtime
var bindAttribute = bindingContext
.ModelType
.GetCustomAttributes(typeof(BindAttribute), true)
.OfType<BindAttribute>()
.FirstOrDefault();
bindingContext.ModelName = bindAttribute != null ? bindAttribute.Prefix : null;
return base.BindModel(controllerContext, bindingContext);
}
}
然后剩下的就是用 Bind 属性装饰你的视图模型:
[Bind(Prefix = "some_prefix")]
public class MyViewModel
{
public string Foo { get; set; }
public string Bar { get; set; }
}
并请求采取此视图模型的操作:
/someaction?some_prefix.foo=the_foo_value&some_prefix.bar=the_bar_value