将数据从html表单保存到List
本文关键字:保存 List 表单 html 数据 | 更新日期: 2023-09-27 18:18:22
我有两个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
。
我需要一些关于如何做这件事的建议。
一旦你已经固定了你的表单(在你发送请求回你的应用程序的默认路由(默认的HomeController.Index()
方法)/,而不是你的Create
方法),你实际上是正确地将值添加到你的列表。问题是,该值只保留当前请求。
为了使事物持久,您需要考虑在内存、数据库或会话中使用持久层。我在下面提供了一个使用会话的完整示例,它将为您提供每个用户列表实例。如果没有这一层,一旦操作完成处理,控制器就会被例行地处理掉,因此对列表的修改就不会被持久化。这是ASP中正常的请求生命周期。当你考虑到你的应用基本上每次只处理一个请求时,这是有意义的。需要注意的是,制作static
本身并不是一种持久化形式,因为它的生命周期和可靠性是不可确定的。它似乎可以工作,但是一旦您的应用程序池回收(即。应用程序被销毁并在内存中重新加载),您将再次失去对列表的所有修正。
我建议你仔细阅读会话状态,以准确理解下面发生的事情。简而言之,每个访问您站点的应用程序用户/唯一访问者都将获得一个唯一的"会话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);
}
请使用:
@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()
时,它默认使用与渲染当前页面相同的控制器/动作