2016-11-17 38 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()沒有它默認使用用於渲染當前頁面相同的控制器/行動的任何參數。