Проблема с привязкой к пользовательской модели MVC - PullRequest
3 голосов
/ 17 августа 2010

У меня есть текстовое поле в моем представлении, которое я хочу получить значение в виде списка строк.

Например, если кто-нибудь введет: 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» моего пользовательского связывателя.

Конечно, я что-то упустил. Не могли бы вы дать мне руку?

1 Ответ

3 голосов
/ 17 августа 2010

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

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

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

...