Привязать флажки к массиву int / enumerable в MVC - PullRequest
17 голосов
/ 16 декабря 2011
@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.

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

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

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

Ответы [ 3 ]

24 голосов
/ 16 декабря 2011

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

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

    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" />
}

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

7 голосов
/ 16 декабря 2011

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

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

5 голосов
/ 18 февраля 2014

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

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

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