как привязать выпадающий список множественного выбора к параметру действия контроллера asp.net - PullRequest
0 голосов
/ 22 февраля 2011

У меня есть html-форма, которая публикует сообщения для контроллера asp.net-mvc и ранее работала нормально.я только что добавил новый выпадающий список множественного выбора (используя плагин fcbkcomplete jquery) и у меня возникают проблемы с привязкой его к новому свойству, которое я только что добавил из моего объекта привязки

я просто перечисляю:

 <select id="SponsorIds" name="SponsorIds"></select>

в html, но похоже, что fcbkcomplete как-то меняет это на name = "SponsorIds []".

Это html, который я получаю после показа " Выбранный источник " в браузере.

<select multiple="multiple" style="display: none;" id="SponsorIds" name="SponsorIds[]">

вот весь html, который выплевывает из плагина

 <select multiple="multiple" style="display: none;" id="SponsorIds" name="SponsorIds[]">
<option class="selected" selected="selected" value="9">MVal</option>
</select>
<ul class="holder">
<li rel="9" class="bit-box">MVal<a href="#" class="closebutton"></a></li>
<li id="SponsorIds_annoninput" class="bit-input"><input size="1" class="maininput"    type="text"></li>
</ul>
<div style="display: none;" class="facebook-auto">
<ul style="width: 512px; display: none; height: auto;" id="SponsorIds_feed">
<li class="auto-focus" rel="9"><em>MVal</li></ul><div style="display: block;" class="default">Type Name . . .
</div>
</div>

и вот мое действие контроллера:

 public ActionResult UpdateMe(ProjectViewModel entity)
    {
    }

ПредставлениеВ модели ProjectViewModel есть свойство:

   public int[] SponsorIds { get; set; }

, которое, как я думал, хорошо с этим связано, но не похоже, так как оно просто отображается как «ноль» на стороне сервера.Кто-нибудь может увидеть что-то здесь не так?

1 Ответ

2 голосов
/ 22 февраля 2011

Правильно названное поле списка (с точки зрения того, с чем может работать механизм связывания модели ASP.NET MVC по умолчанию):

name="SponsorIds"

, а не:

name="SponsorIds[]"

впо крайней мере, если вы ожидаете связать это обратно с int[] с помощью связывателя модели по умолчанию.И это то, что генерирует хелпер Html.ListBoxFor.Пример:

@Html.ListBoxFor(
    x => x.SponsorIds, 
    new SelectList(
        new[] { 
            new { Value = "1", Text = "MVal1" },
            new { Value = "2", Text = "MVal2" }, 
            new { Value = "3", Text = "MVal3" }, 
        }, 
        "Value", "Text"
    )
)

испускает:

<select id="SponsorIds" multiple="multiple" name="SponsorIds">
    <option value="1">MVal1</option>
    <option value="2">MVal2</option>
    <option value="3">MVal3</option>
</select>

и переплет модели счастлив.


ОБНОВЛЕНИЕ:

Вы также можете иметьпользовательское связующее для моделей, способное анализировать это:

public class FCBKCompleteIntegerArrayModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var values = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[]");
        if (values != null && !string.IsNullOrEmpty(values.AttemptedValue))
        {
            // TODO: A minimum of error handling would be nice here
            return values.AttemptedValue.Split(',').Select(x => int.Parse(x)).ToArray();
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

и затем зарегистрировать это связующее в Application_Start:

protected void Application_Start()
{
    ...
    ModelBinders.Binders.Add(typeof(int[]), new FCBKCompleteIntegerArrayModelBinder());
}
...