.net 使用MVC ModelBinder在绑定前过滤post值

.net 使用MVC ModelBinder在绑定前过滤post值,.net,asp.net-mvc-2,forms,modelbinders,.net,Asp.net Mvc 2,Forms,Modelbinders,我需要过滤掉一些值,然后才能从MVC2中的POST数据绑定它们。不幸的是,我无法更改客户端代码,该代码有时会为要映射为十进制的表单值传递“N/A”?类型。需要做的是,如果“N/A”是POST值,则在绑定/验证之前将其清空 我整个上午都在尝试使用ModelBinder来扩展DefaultModelBinder: public class DecimalFilterBinder : DefaultModelBinder { protected override void BindProper

我需要过滤掉一些值,然后才能从MVC2中的POST数据绑定它们。不幸的是,我无法更改客户端代码,该代码有时会为要映射为十进制的表单值传递“N/A”?类型。需要做的是,如果“N/A”是POST值,则在绑定/验证之前将其清空

我整个上午都在尝试使用ModelBinder来扩展DefaultModelBinder:

public class DecimalFilterBinder : DefaultModelBinder
{
    protected override void BindProperty(ControllerContext controllerContext,
        ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
    {
        if (propertyDescriptor.PropertyType == typeof(decimal?))
        {
            var model = bindingContext.Model;
            PropertyInfo property = model.GetType().GetProperty(propertyDescriptor.Name);
            var httpRequest = controllerContext.RequestContext.HttpContext.Request;
            if (httpRequest.Form[propertyDescriptor.Name] == "-" ||
                httpRequest.Form[propertyDescriptor.Name] == "N/A")
            {
                property.SetValue(model, null, null);
            }
            else
            {
                base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
            }
        }
        else
        {
            base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
        }
    }
}

我遇到的问题是,当原始发布的值位于列表中时,我不知道如何访问它。我不能只使用
表单[propertyDescriptor.Name]
,因为它包含在表单的列表项中(例如,输入实际上是
值[0].Property1
)。我将模型绑定器连接到global.asax中并运行良好,我只是不知道如何在默认绑定发生之前获取原始表单值以将其过滤为空字符串。

哇,bindingContext有一个ModelName属性,它为您提供前缀(用于列表项)。使用它可以获得原始表单值:

...
var httpRequest = controllerContext.RequestContext.HttpContext.Request;
if (httpRequest.Form[bindingContext.ModelName + propertyDescriptor.Name] == "-" ||
    httpRequest.Form[bindingContext.ModelName + propertyDescriptor.Name] == "N/a")
{
    property.SetValue(model, null, null);
}
else
{
    base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
...