Вы можете безоговорочно применить связующее для модели в вашем Application_Start
:
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
, а затем иметь настраиваемый фильтр авторизации (да, фильтр авторизации, поскольку он запускается до подшивки модели), который будет вставлять в HttpContext некоторое значение, которое впоследствии может быть использовано подшивателем модели:
[AttributeUsage(AttributeTargets.Method)]
public class MyDecimalBinderAttribute : ActionFilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
filterContext.HttpContext.Items["_apply_decimal_binder_"] = true;
}
}
и затем в тесте связывания модели, если HttpContext содержит пользовательское значение перед его применением:
public class DecimalModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (controllerContext.HttpContext.Items.Contains("_apply_decimal_binder_"))
{
// The controller action was decorated with the [MyDecimalBinder]
// so we can proceed
return 999M;
}
// fallback to the default binder
return base.BindModel(controllerContext, bindingContext);
}
}
Теперь все, что осталось, это украсить действие вашего контроллера пользовательским фильтром, чтобы включить десятичную подшивку:
[HttpPost]
[MyDecimalBinder]
public ActionResult Index(Model model)
{
return View(model);
}