2

我正在使用 ViewData 将 List<string> 传递给我的视图:

// Controller:
ViewData["myList"] = new SelectList(new List<string>(new[] "AAA", "BBB", "CCC" }));

我使用这个 List 来填充 ListBox:

// View:
@Html.ListBox("myList")

在发布时,我检索选定的项目,如下所示:

// Controller:
string myList = form["myList"]

到目前为止一切顺利,但选定的项目都在 Post 上被清除。
如何使所选项目在请求中保持不变?

4

4 回答 4

1

由于 MVC 没有任何类似 viewstate 或 controlstate 的机制,因此数据不能在请求之间自动持久化。因此,对于每个请求,您都必须按照您希望的方式创建页面。在发布时,当您获得所选项目时,您必须将值发送到视图以供下一次加载。

这是一个链接,您可以在其中获取工作代码

于 2013-10-03T19:46:32.797 回答
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" />
}
于 2013-10-03T21:24:35.383 回答
0

如果您使用的是列表框,这意味着您可以选择几个您必须使用 MultiselectList

ViewData["myList"] = new MultiSelectList(new List<string>(new[] "AAA", "BBB", "CCC" }));
于 2013-10-03T19:41:09.300 回答
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")
于 2013-10-03T20:32:56.403 回答