2010-02-25 3 views
0

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

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); 
    } 
} 

ответ

1

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

Изменить код:

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

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

+0

Это не та часть, что изменение интерфейса не позволяет мне делать. Это от 2-й до последней строки, где я перезаписываю результат в коллекции ValueProvider. – JeremyWeir

+0

Что касается литых, я использую только это связующее устройство для свойств, которые, как я знаю, будут соответствовать данным формы. – JeremyWeir

+0

Вам нужно будет обновить * конкретный источник * (например, controllerContext.HttpContext.Request.QueryString [something]. –

 Смежные вопросы

  • Нет связанных вопросов^_^