我需要這個的原因:在我的一個控制器中,我想以不同於應用程序其餘部分的方式綁定所有Decimal值。我不想註冊模型綁定在Global.asax中(通過ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
)自定義模型綁定器來綁定嵌套屬性值
我試圖從DefaultModelBinder
類派生並覆蓋其BindProperty
方法,但只適用於模型實例的直接(不嵌套)十進制屬性。
我有以下的例子來說明我的問題:
namespace ModelBinderTest.Controllers
{
public class Model
{
public decimal Decimal { get; set; }
public DecimalContainer DecimalContainer { get; set; }
}
public class DecimalContainer
{
public decimal DecimalNested { get; set; }
}
public class DecimalModelBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
if (propertyDescriptor.PropertyType == typeof (decimal))
{
propertyDescriptor.SetValue(bindingContext.Model, 999M);
return;
}
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
public class TestController : Controller
{
public ActionResult Index()
{
Model model = new Model();
return View(model);
}
[HttpPost]
public ActionResult Index([ModelBinder(typeof(DecimalModelBinder))] Model model)
{
return View(model);
}
}
}
該解決方案只設置Model
的Decimal
屬性爲999,但沒有做任何事情來DecimalContainer
的DecimalNested
財產。我意識到這是因爲在我的DecimalModelBinder
的BindProperty
重寫中調用base.BindProperty
,但我不知道如何說服基類在處理小數屬性時使用我的模型活頁夾。