Использование MVC ModelBinders для фильтрации записей перед привязкой - PullRequest
3 голосов
/ 11 января 2011

Мне нужно отфильтровать некоторые значения, прежде чем они будут связаны с данными POST в MVC2. К сожалению, я не могу изменить код на стороне клиента, который иногда передает «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);
        }
    }
}

Проблема в том, что я не знаю, как получить доступ к первоначально опубликованному значению, когда оно находится в списке. Я не могу просто набрать Form[propertyDescriptor.Name], потому что он содержится в элементе списка в форме (например, на самом деле ввод Values[0].Property1). У меня связыватель модели подключен в global.asax и работает нормально, я просто не знаю, как получить исходное значение формы, чтобы отфильтровать его в пустую строку, прежде чем произойдет связывание по умолчанию.

1 Ответ

1 голос
/ 11 января 2011

Wow, 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);
}
...
...