我有两个Create
方法,其中一个用HttpGet
修饰,另一个用HttpPost
修饰。我有一个创建视图,第一个看起来像这样:
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<form action="/" method="post">
<input type="text" name="txt" value="" />
<input type="submit" />
</form>
方法:
List<string> myList = new List<string> { "element1", "element2", "element3" };
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(string txt)
{
//myList.Add(Request.Form["txt"]);
myList.Add(txt);
return View();
}
我正在尝试将数据从我的表单按钮传递到第二个Create()
并将其保存到myList
。
我需要一些关于如何使这项工作的建议。
答案 0 :(得分:3)
修复表单后(通过将请求发送到/而不是HomeController.Index()
方法,您将回复到应用程序的默认路由(默认为Create
方法)) ,您实际上是正确地将值添加到列表中。问题是,该值仅适用于当前请求。
为了使事情持久化,您需要考虑内存,数据库或会话中的持久层。我在下面提供了一个使用会话的完整示例,它将为您提供每用户列表实例。如果没有这一层,一旦操作完成处理,您的Controller将被定期处理,因此对列表的修改不会保留。这是ASP.NET中的正常请求生命周期,当您认为您的应用程序基本上一次只处理1个请求时,这是有意义的。重要的是要注意,制作static
不是一种持久性本身,因为它的生命周期和可靠性是不确定的。它似乎可以工作,但是一旦你的应用程序池回收(即应用程序被销毁并重新加载到内存中),你将再次失去对列表的所有修改。
我建议你阅读Session State以了解下面发生了什么。简而言之,您站点的每个应用程序用户/唯一访问者都将获得一个唯一的“会话ID”,然后您可以使用此会话ID来存储您希望在服务器端使用的数据。这就是为什么,如果您要从不同的浏览器访问Create
方法(或尝试私有模式),您将维护两个单独的数据列表。
查看(也将列表输出给用户):
@model List<string>
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<ul>
@foreach(var str in Model)
{
<li>@str</li>
}
</ul>
@using (Html.BeginForm())
{
<input type="text" name="txt" />
<input type="submit" />
}
控制器内容:
public List<string> MyList
{
get
{
return (List<string>)(
// Return list if it already exists in the session
Session[nameof(MyList)] ??
// Or create it with the default values
(Session[nameof(MyList)] = new List<string> { "element1", "element2", "element3" }));
}
set
{
Session[nameof(MyList)] = value;
}
}
public ActionResult Create()
{
return View(MyList);
}
[HttpPost]
public ActionResult Create(string txt)
{
MyList.Add(txt);
return View(MyList);
}
答案 1 :(得分:1)
请使用此:
@using (Html.BeginForm("Create", "Controller", FormMethod.Post)){
<input type="text" name="txt" value="" />
<input type="submit" />
}
将Controller
替换为您的控制器名称。
或者只是使用:
@using (Html.BeginForm()){
<input type="text" name="txt" value="" />
<input type="submit" />
}
当您在没有任何参数的情况下致电BeginForm()
时,默认使用与呈现当前页面相同的控制器/操作。