Метод Html.CheckBox
имеет странную реализацию.Флажки будут иметь уникальное значение name
и, по сути, значение true/false
.Это сделано для того, чтобы значение легко отображалось в параметре bool
в действии.
Как вы, очевидно, заметили, это создает сложную ситуацию, когда ваши флажки являются динамическими.
Решение состоит в том, чтобы создать свои собственные флажки, все с использованием общих name
и имеющих уникальные value
s.Они очень хорошо отобразятся в вашем действии!
См. Также этот вопрос, для некоторых замечательных примеров и объяснений .
Вот необходимое действие:
public ActionResult SetSelectedColumns(string[] selectedColumns) {
// selectedColumns will contain the keys of all the checked columns.
}
А вот как правильно настроить отображение HTML:
<input type="checkbox" name="selectedColumns" value="@column.Key" @(column.Selected ? "checked='checked'" : "") />
Я настоятельно рекомендую включить эту функцию в метод расширения, чтобы вы также могли включить ModelState
и htmlAttributes
.Вот моя непроверенная попытка:
public static HtmlString CheckBoxAlt(this HtmlHelper html, string name, string value, bool selected, object htmlAttributes)
{
var tag = new TagBuilder("input");
if (htmlAttributes != null)
tag.MergeAttributes(new RouteValueDictionary(htmlAttributes));
tag.MergeAttribute("type", "checkbox");
tag.MergeAttribute("name", name);
tag.MergeAttribute("value", value);
// Determine if this check should be selected:
var state = html.ViewData.ModelState[name];
if (state != null)
{
var values = (string[])state.Value.ConvertTo(typeof(string[]));
selected = Array.IndexOf(values, value) != -1;
}
if (selected)
tag.MergeAttribute("checked", "checked");
return new HtmlString(tag.ToString(TagRenderMode.SelfClosing));
}