2016-11-17 147 views
2

我有两个Create方法,一个用HttpGet装饰,另一个用HttpPost装饰。将数据从html表格保存到列表

@{ 
    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(); 
    } 

我simly试图从我的形式传递数据上的按钮,我的第二个Create()并保存到myList

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

+0

..什么是不工作?这似乎工作得很好(假设你的'

+0

@RudiVisser它只是没有添加到列表 –

+0

@RobertRoss什么你的意思是“不添加”?在第二个请求'myList'只包含默认值? – feeeper

回答

3

一旦你(通过将请求发送到/,而不是你的Create方法,你回发到你的应用程序的默认路径(默认为HomeController.Index()法))固定表单,你实际上是正确添加该值列表。问题是,该值只能用于当前的请求。

为了使事情持久化,您需要考虑内存,数据库或会话中的持久层。我在下面提供了一个使用会话的完整示例,它将为您提供每个用户列表实例。如果没有这个图层,一旦动作完成处理,你的控制器就会被例行处理掉,所以修改你的列表并不会被持久化。这是ASP.NET中的正常请求生命周期,当您认为您的应用程序基本上一次只处理一次请求时就很有意义。重要的是要注意,制作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

请使用:

@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()没有它默认使用用于渲染当前页面相同的控制器/行动的任何参数。