将数据从html表单保存到List

时间:2016-11-17 17:21:12

标签: 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" />   
</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

我需要一些关于如何使这项工作的建议。

2 个答案:

答案 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()时,默认使用与呈现当前页面相同的控制器/操作。