Связать флажки с массивом int/перечисляемым в MVC

@Html.CheckBox("orderNumbers", new { value = 1 })
@Html.CheckBox("orderNumbers", new { value = 2 })
@Html.CheckBox("orderNumbers", new { value = 3 })
@Html.CheckBox("orderNumbers", new { value = 4 })
@Html.CheckBox("orderNumbers", new { value = 5 })

[HttpPost]
public ActionResult MarkAsCompleted(IEnumerable<int> orderNumbers) { }

[HttpPost]
public ActionResult MarkAsCompleted(IEnumerable<string> orderNumbers) { }

Если я использую первую подпись в своем методе действий, я получаю пустой IEnumerable.

Если я использую вторую подпись, я получаю значения, но также получаю ложное значение для невыделенных значений (из-за шаблона MVCs для затенения всех флажков со скрытым полем).

например. Я получу что-то вроде orderNumbers = { "1", "2", "false", "4", "false" }

Почему я не могу получить список чисел?

Ответы

Ответ 1

Потому что так работает вспомогательный помощник CheckBoxFor.

Вам нужно создать html для флажков самостоятельно. Затем скрытые входы не генерируются, и вы получите только выбранные целочисленные значения.

Ответ 2

Вы можете получить все проверенные значения следующим образом.

Код контроллера:

    public ActionResult Index()
    {            
        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(string[] orderNumbers)
    {
        return View();
    }

Просмотр кода:

@using (Html.BeginForm())
{
    <input name="orderNumbers" type="checkbox" value="1" />
    <input name="orderNumbers" type="checkbox" value="2" />
    <input name="orderNumbers" type="checkbox" value="3" />
    <input name="orderNumbers" type="checkbox" value="4" />
    <input name="orderNumbers" type="checkbox" value="5" />

    <input type="submit" name="temp" value="hi" />
}

Пожалуйста, помните, что вам нужно указать одинаковое имя для всех флажков. В массиве вы получите значения для всех отмеченных флажков.

Ответ 3

В дополнение к alok_dida отличный ответ. Поскольку все значения являются целыми числами, вы можете иметь код контроллера, который принимает массив целых чисел, и не делайте преобразования самостоятельно.

Это работает в MVC4 +:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(int[] orderNumbers)
{
    return View();
}