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);
}