我正在使用ViewData传递List< string>我的观点:
// Controller:
ViewData["myList"] = new SelectList(new List<string>(new[] "AAA", "BBB", "CCC" }));
我使用此List填充ListBox:
// View:
@Html.ListBox("myList")
On Post我检索所选项目,如下所示:
// Controller:
string myList = form["myList"]
到目前为止一切顺利,但所有项目都在Post上清除 如何在请求中保留所选项目?
答案 0 :(得分:1)
由于MVC没有像viewstate或controlstate这样的机制,因此无法自动跨请求保留数据。因此,对于每个请求,您都必须根据需要创建页面。在获得所选项目的帖子中,您必须将值发送到要为下次加载选择的视图。
以下链接可让您了解code。
答案 1 :(得分:1)
如前所述,MVC没有ViewState机制,因此您希望在视图中呈现的值必须使用每个请求进行实例化。
这是一个相当粗略的例子,但应该概述你需要做的事情:
public ActionResult Index()
{
ViewData["myList"] = GetSelectList();
return View();
}
[HttpPost]
public ActionResult Index(FormCollection form)
{
ViewData["myList"] = GetSelectList(form["myList"]);
return View();
}
private MultiSelectList GetSelectList(string selected = "")
{
var selectedValues = selected.Split(',');
return new MultiSelectList(new List<string>(new[] { "AAA", "BBB", "CCC" }), selectedValues);
}
查看标记
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@using (Html.BeginForm()) {
@Html.ListBox("myList")
<input type="submit" value="Submit" />
}
答案 2 :(得分:0)
如果您使用列表框,这意味着您可以选择几个,您必须使用MultiselectList
ViewData["myList"] = new MultiSelectList(new List<string>(new[] "AAA", "BBB", "CCC" }));
答案 3 :(得分:0)
您可以将数据添加到会话对象中。
Session["myList"] = your List<string>
当您需要将其拉回会话时,请使用...
List<string> myList = (List<string>)Session["myList"];
使用您的代码,
var selectList = new SelectList(new List<string> {"AAA", "BBB", "CCC"});
Session["myList"] = selectList;
然后,如果你想在控制器中将它分配给ViewData ......
ViewData["myList"] = (SelectList)Session["myList"]; //may not need the cast.
@Html.ListBox("myList")