如何使控制值在请求中保持不变?

时间:2013-10-03 19:32:41

标签: asp.net-mvc asp.net-mvc-4 razor

我正在使用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上清除 如何在请求中保留所选项目?

4 个答案:

答案 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")