3

У меня есть текстовое поле, на мой взгляд, что я хочу получить значение в виде списка строк.MVC custom model binder issue

В качестве примера, если кто-либо входит: tag1, tag2, tag3 ... получает список с 3 элементами.

Я сделал пользовательское связующее устройство, но я все еще получаю от поста строку вместо списка.

Это вещи, которые я сделал:

Это моя модель:

public class BaseItem 
{ 
    [Required] 
    [StringLength(100)] 
    public string Name 
    { 
     get; 
     set; 
    } 
    public IList<string> RelatedTags 
    { 
     get; 
     set; 
    } 

} 

мой взгляд напечатанная с моделью выше:

<% using (Html.BeginForm()) {%> 
     <%: Html.ValidationSummary("Please complete in a right way the fields below.") %> 

     <fieldset> 
      <legend>Fields</legend> 
      <div class="editor-field"> 
       <%: Html.LabelFor(e => e.Name)%> 
       <%: Html.TextBoxFor(e => e.Name)%> 
       <%: Html.ValidationMessageFor(e => e.Name)%> 
      </div> 
      <div class="editor-field"> 
       <%: Html.LabelFor(e => e.RelatedTags)%> 
       <%: Html.TextBoxFor(e => e.RelatedTags)%> 
       <%: Html.ValidationMessageFor(e => e.RelatedTags)%> 
      </div> 
      <p> 
       <input type="submit" /> 
      </p> 
     </fieldset> 

    <% } %> 

Мой обычай модель связующего:

public class TagModelBinder:DefaultModelBinder 
{ 
    protected override object GetPropertyValue(
     ControllerContext controllerContext, 
     ModelBindingContext bindingContext, 
     System.ComponentModel.PropertyDescriptor propertyDescriptor, 
     IModelBinder propertyBinder) 
    { 
     object value = base.GetPropertyValue(
          controllerContext, 
          bindingContext, 
          propertyDescriptor, 
          propertyBinder); 
     object retVal = value; 
     if (propertyDescriptor.Name == "RelatedTags") 
     {     
      retVal = bindingContext.ValueProvider.GetValue("RelatedTags") 
         .RawValue.ToString().Split(',').ToList<string>(); 
     } 
     return retVal; 
    } 
} 

Я зарегистрировал Выборочная модель связующего на моем Global.asax.cs файле:

ModelBinders.Binders.Add(typeof(string), new TagModelBinder()); 

вопрос, что им с в том, что никогда не входит в методе «GetPropertyValue» моего пользовательского вяжущего.

Наверняка им что-то не хватает. Могли бы вы дать мне руку?

+0

Вы когда-нибудь получали лучший ответ на этот вопрос? –

ответ

3

Попробуйте привязать к typeof IList, поскольку это тот тип, который вы также пытаетесь связать.

ModelBinders.Binders.Add(typeof(IList<string>), new TagModelBinder()); 

Надеюсь, это поможет.

+0

Привет Тарн, спасибо за ответ в первую очередь. Это не сработало, но я подумал, что это должно быть «typeof (string)», так как я получаю строку в HttpRequest.Form ["RelatedTags"]. С наилучшими пожеланиями. Jose – Sosi

+0

На самом деле все ваши значения HttpRequest.Form будут строками. Вот почему вам нужно ModelBind их в другие типы, например список строк :) Возможно, вам придется написать связующее для BaseItem, если это то, что вы пытаетесь связать в своем действии, я не уверен, что ASP.NET Взаимодействие модели MVC использует пользовательские привязки модели по таким свойствам, но я могу ошибаться. В любом случае, typeof (string) неверен. – tarn

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

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