【发布时间】:2012-02-24 16:59:56
【问题描述】:
我需要这个的原因:在我的一个控制器中,我想以与我的应用程序的其余部分不同的方式绑定所有 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,但我不知道如何说服基类在处理十进制属性时使用我的模型绑定器。
【问题讨论】:
标签: asp.net-mvc-3 model-binding defaultmodelbinder