Html.CheckBox
メソッドには奇妙な実装があります。チェックボックスには一意のname
があり、本質的にはtrue/false
という値になります。これは、値がアクション内のbool
パラメータに簡単にマップされるようにするためです。
明らかに気づいたように、これはチェックボックスが動的な場合には厄介な状況になります。
解決策は、共通のname
を使用し、ユニークなvalue
を使用して、独自のチェックボックスを生成することです。これらはあなたの行動に非常にうまく対応します!
See this question too, for some great examples and explanations。ここで
は、望ましい行動です:
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));
}
ええ、それは私が今ダウンする道です。あなたはあなたの答えの拡張メソッドの部分について詳しく説明できますか? – link664
@ link664私はあなたのための拡張方法を書いた!お楽しみください:) –
おかげで@スコットリッピー、魅力のように動作します! – link664