你可以寫在相應的視圖模型的自定義模型綁定:
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(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
感謝。我寧願不向系統中引入更多移動部件,因爲這不是OOtB支持的方案,所以我只裝飾參數並繼續前進。 – lsuarez
在我做這件事之前,有一個簡單的問題是,將binder與基本模型類相關聯後,是否可以跨所有繼承它的模型重用,而無需在應用程序啓動時指定幾個這樣的指令? – lsuarez
如果我沒有記錯,這將與基本模型和單一註冊一起工作,但我不是100%確定,應該測試。 –