C# 将数据从html表单保存到列表
我有两个C# 将数据从html表单保存到列表,c#,asp.net-mvc,C#,Asp.net Mvc,我有两个Create方法,一个用HttpGet修饰,另一个用HttpPost修饰。我为第一个视图创建了如下视图: @{ ViewBag.Title = "Create"; } <h2>Create</h2> <form action="/" method="post"> <input type="text" name="txt" value="" /> <input type="submit" /> &l
Create
方法,一个用HttpGet
修饰,另一个用HttpPost
修饰。我为第一个视图创建了如下视图:
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<form action="/" method="post">
<input type="text" name="txt" value="" />
<input type="submit" />
</form>
@{
ViewBag.Title=“创建”;
}
创造
方法:
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();
}
List myList=新列表{“element1”、“element2”、“element3”};
公共操作结果创建()
{
返回视图();
}
[HttpPost]
公共操作结果创建(字符串txt)
{
//myList.Add(Request.Form[“txt]”);
myList.Add(txt);
返回视图();
}
我正在简单地尝试将数据从“表单打开”按钮传递到第二个Create()
,并将其保存到myList
我需要一些关于如何进行此操作的建议。请使用此:
@using (Html.BeginForm("Create", "Controller", FormMethod.Post)){
<input type="text" name="txt" value="" />
<input type="submit" />
}
当您在没有任何参数的情况下调用
BeginForm()
时,它默认使用用于呈现当前页面的相同控制器/操作。一旦您修复了表单(即您将发回应用程序的默认路径(默认情况下HomeController.Index()
方法)通过将请求发送到/,而不是您的Create
方法),您实际上正确地将值添加到了列表中。问题是,该值只保留在当前请求中
<>为了使事情持久化,需要考虑内存、数据库或会话中的持久层。我在下面提供了使用会话的完整示例,它将为您提供每个用户的列表实例。如果没有这一层,您的控制器将在操作完成处理后被例行地处理,因此对列表的修改不会持久化。这是ASP.NET中的正常请求生命周期,当你认为你的应用程序基本上每次只处理1个请求时才有意义。重要的是要注意,使某个东西静态本身并不是持久性的一种形式,因为它的生命周期和可靠性是不确定的。它似乎可以工作,但一旦你的应用程序池回收(即,应用程序被销毁并重新加载到内存中),你将再次丢失对列表的所有修改
我建议你仔细阅读下面的内容。简而言之,您站点的每个应用程序用户/唯一访问者都将获得一个唯一的“会话ID”,然后您可以使用此会话ID来存储希望在服务器端使用的数据。这就是为什么,如果您要从不同的浏览器访问Create
方法(或尝试私有模式),您将维护两个独立的数据列表
视图(也将列表输出给用户):
@型号列表
@{
ViewBag.Title=“创建”;
}
创造
@foreach(模型中的var str)
{
- @str
}
@使用(Html.BeginForm())
{
}
控制器内容:
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);
}
公共列表MyList
{
得到
{
返回(列表)(
//返回会话中已存在的列表
会话[名称(MyList)]??
//或者使用默认值创建它
(Session[nameof(MyList)]=新列表{“element1”、“element2”、“element3});
}
设置
{
会话[名称(MyList)]=值;
}
}
公共操作结果创建()
{
返回视图(MyList);
}
[HttpPost]
公共操作结果创建(字符串txt)
{
MyList.Add(txt);
返回视图(MyList);
}
。。什么不起作用?这似乎工作得非常好(假设您的@rudiviser它只是没有添加到list@RobertRoss“不加”是什么意思在第二个请求<代码> MyList只包含默认值?我的目的是使用表单添加更多元素。您是,但仅针对那个单一请求。您不与它们一起做任何事情。如果要存储它们,请考虑使用<代码>会话< /C>以进行开发,我将发布一个示例。
@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);
}