【发布时间】:2016-07-25 17:24:10
【问题描述】:
我正在尝试构建一个 html 帮助程序来创建复选框列表,该列表将使用会话保持检查状态。它在大多数情况下都有效,当您选中和取消选中各种框并单击提交时会记住复选框状态。但是,如果您检查并提交了复选框,然后您返回并清除复选框并重新提交(当它们全部清除时) - 它似乎想要记住最后的选择。这是我写的……
[家庭控制器]
public ActionResult Index()
{
TestViewModel tvm = new TestViewModel();
return View(tvm);
}
[HttpPost]
public ActionResult Index(TestViewModel viewModel)
{
viewModel.SessionCommit();
return View(viewModel);
}
[索引视图]
@model TestApp.Models.TestViewModel
@{
ViewBag.Title = "Index";
}
@using (Html.BeginForm())
{
<p>Checkboxes:</p>
@Html.CheckedListFor(x => x.SelectedItems, Model.CheckItems, Model.SelectedItems)
<input type="submit" name="Submit form" />
}
[TestViewModel]
// Simulate the checklist data source
public Dictionary<int, string> CheckItems
{
get
{
return new Dictionary<int, string>()
{
{1, "Item 1"},
{2, "Item 2"},
{3, "Item 3"},
{4, "Item 4"}
};
}
}
// Holds the checked list selections
public int[] SelectedItems { get; set; }
// Contructor
public TestViewModel()
{
SelectedItems = GetSessionIntArray("seld", new int[0] );
}
// Save selections to session
public void SessionCommit()
{
System.Web.HttpContext.Current.Session["seld"] = SelectedItems;
}
// Helper to get an int array from session
int[] GetSessionIntArray(string sessionVar, int[] defaultValue)
{
if (System.Web.HttpContext.Current.Session == null || System.Web.HttpContext.Current.Session[sessionVar] == null)
return defaultValue;
return (int[])System.Web.HttpContext.Current.Session[sessionVar];
}
[HTML 助手]
public static MvcHtmlString CheckedList(this HtmlHelper htmlHelper, string PropertyName, Dictionary<int, string> ListItems, int[] SelectedItemArray)
{
StringBuilder result = new StringBuilder();
foreach(var item in ListItems)
{
result.Append(@"<label>");
var builder = new TagBuilder("input");
builder.Attributes["type"] = "checkbox";
builder.Attributes["name"] = PropertyName;
builder.Attributes["id"] = PropertyName;
builder.Attributes["value"] = item.Key.ToString();
builder.Attributes["data-val"] = item.Key.ToString();
if (SelectedItemArray.Contains(item.Key))
builder.Attributes["checked"] = "checked";
result.Append(builder.ToString(TagRenderMode.SelfClosing));
result.AppendLine(string.Format(" {0}</label>", item.Value));
}
return MvcHtmlString.Create(result.ToString());
}
public static MvcHtmlString CheckedListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, Dictionary<int, string> ListItems, int[] SelectedItemArray)
{
var name = ExpressionHelper.GetExpressionText(expression);
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
return CheckedList(htmlHelper, name, ListItems, SelectedItemArray);
}
我已经阅读了this SO question,我认为这可能与模型绑定器不知道何时没有选中复选框有关,但即使我已经阅读了该帖子和其他各种帖子 - 我不再赘述前进。
在一篇文章中,我看到隐藏字段通常与复选框结合使用以传递复选框的“假”状态,但我无法使用多个复选框回发到单个属性。
有人能解释一下吗?
已编辑:包括我在这篇文章中强调的demonstration project。希望这会帮助有人帮助我!
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-5 html-helper checkboxlist