2013-05-21 4 views
1

Я вижу странную (для меня) проблему, когда я пытаюсь опубликовать массив целых чисел на основе флажков. Когда значения не отправляются по порядку, модельное связующее не работает так, как я ожидал бы.Связывание нумерованных массивов в MVC

я могу воспроизвести это на очень простого действие

public ActionResult Debug(string[] Unassigned) 
    { 
     return RedirectToAction("Index", new { id = 7 }); 
    } 

Пример этого не работает будет, когда следующие значения размещаются (копируются в через немедленное окно). Я хотел бы ожидать Unassigned иметь значения 8 и 6.

? Request.Form.AllKeys 
{string[4]} 
[0]: "__RequestVerificationToken" 
[1]: "LoginId" 
[2]: "Unassigned[1]" 
[3]: "Unassigned[3]" 
? Request.Form["Unassigned[1]"] 
"8" 
? Request.Form["Unassigned[3]"] 
"6" 
? Unassigned 
null 

Когда значения передаются в порядке, это работает (обратите внимание Unassigned[3] не получает связаны, как Unassigned[2] не отвечал.

? Request.Form.AllKeys 
{string[5]} 
[0]: "__RequestVerificationToken" 
[1]: "LoginId" 
[2]: "Unassigned[0]" 
[3]: "Unassigned[1]" 
[4]: "Unassigned[3]" 
? Request.Form["Unassigned[0]"] 
"2" 
? Request.Form["Unassigned[1]"] 
"8" 
? Request.Form["Unassigned[3]"] 
"6" 
? Unassigned 
{string[2]} 
[0]: "2" 
[1]: "8" 

Минус форматирование, мой HTML выглядит следующим образом

<input type="checkbox" name="Unassigned[0]" value="2"> 
<input type="checkbox" name="Unassigned[1]" value="8"> 
<input type="checkbox" name="Unassigned[2]" value="7"> 
<input type="checkbox" name="Unassigned[3]" value="6"> 
<input type="checkbox" name="Unassigned[4]" value="5"> 
<input type="checkbox" name="Unassigned[5]" value="9"> 
<input type="checkbox" name="Unassigned[6]" value="4"> 
<input type="checkbox" name="Unassigned[7]" value="3"> 
<input type="checkbox" name="Unassigned[8]" value="1"> 

Учитывая, что select is not broken то, что я делаю неправильно?

+1

Вы не делаете ничего плохого, это то, как работает связующее устройство по умолчанию, когда дело доходит до массивов/списков. В тот момент, когда он не может найти соответствующий индекс + 1, он вызывает его завершение. – rossisdead

ответ

3

Учитывая, что выбор не нарушен, что делаете неправильно?

Вы не уважая convention for binding to a list, потому что у вас есть отверстия в индексах. Вы можете использовать несекретные индексы, например Guides. Посмотрите на сообщение блога Фила Хаак, с которым я связался. У него есть целая секция, посвященная этому.

Другая возможность, которую я бы рекомендовал вам, - использовать модель представления. Так идти вперед и написать одно:

public class ItemViewModel 
{ 
    public string Id { get; set; } 
    public bool Selected { get; set; } 
} 

, а затем вы можете иметь контроллер:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new[] 
     { 
      new ItemViewModel { Id = "2" }, 
      new ItemViewModel { Id = "8" }, 
      new ItemViewModel { Id = "7" }, 
      new ItemViewModel { Id = "6" }, 
      new ItemViewModel { Id = "5" }, 
      new ItemViewModel { Id = "4" }, 
      new ItemViewModel { Id = "3" }, 
      new ItemViewModel { Id = "1" }, 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(ItemViewModel[] model) 
    { 
     // everything will be correctly bound here 
    } 
} 

и соответствующий сильно типизированной:

@model ItemViewModel[] 
@using (Html.BeginForm()) 
{ 
    for (var i = 0; i < Model.Length; i++) 
    { 
     Html.HiddenFor(x => x[i].Id) 
     Html.CheckBoxFor(x => x[i].Selected) 
    } 

    <button type="submit">OK</button> 
} 
Смежные вопросы