将数据从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

我需要一些关于如何做这件事的建议。

将数据从html表单保存到List

一旦你已经固定了你的表单(在你发送请求回你的应用程序的默认路由(默认的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()时,它默认使用与渲染当前页面相同的控制器/动作