Как обновить пользовательский ModelBinder для работы с измененным интерфейсом ModelBindingContext.ValueProvider в ASP.NET MVC RC2 - PullRequest
0 голосов
/ 25 февраля 2010

У меня есть пользовательское связующее для модели, которое берет список, разделенный запятыми, и очищает все пустые значения, а затем передает его в связующее для модели по умолчанию. Это работало в ASP.NET MVC Preview 2, но при обновлении до RC2 приведенное ниже не будет компилироваться, поскольку интерфейс ValueProvider имеет только метод GetValue (), а не метод доступа []. Возможно ли то, что я делаю ниже, через какой-то другой механизм в контексте привязки? Я бы предпочел не создавать полнофункциональный переплет модели для такой простой ситуации. Основная цель - когда значения привязаны к списку , все пустые значения пропускаются.

public class EnumListModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var result = bindingContext.ValueProvider[bindingContext.ModelName];
        string[] rawValues = (string[])result.RawValue;
        var newValues = new List<string>();
        foreach (string value in rawValues)
        {
            if (!String.IsNullOrEmpty(value))
            {
                newValues.Add(value);
            }
        }

        string newValuesAttempted = String.Join(",", newValues.ToArray());
        // overwrite the ValueProviderResult with the cleaned up csv list
        // this is the part I'm not sure how to implement using the interface
        bindingContext.ValueProvider[bindingContext.ModelName] = 
           new ValueProviderResult(newValues.ToArray(), newValuesAttempted, result.Culture);

        return System.Web.Mvc.ModelBinders.Binders.DefaultBinder.BindModel(controllerContext, bindingContext);
    }
}

Ответы [ 2 ]

1 голос
/ 25 февраля 2010

Что именно не так с использованием GetValue() вместо [] здесь? Это делает то же самое. Но ValueProvider теперь интерфейс, и интерфейсы не могут иметь индексаторы. Следовательно, GetValue().

Измените свой код на:

var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

Я немного удивлен, что приведение на следующей строке когда-либо сработало. Кажется, сильно зависит от того, что пользователь фактически представляет и каков конкретный тип свойства. Это не относится к вашему вопросу.

0 голосов
/ 01 марта 2010

Здесь не было особого решения, поскольку коллекция ValueProvider доступна только для чтения. Вместо этого я использовал связующее для пользовательской модели

Есть ли способ заставить DefaultModelBinder игнорировать пустые элементы при привязке к списку

...