2015-09-03 57 views
-1

我開始學習asp網絡。我想在表中顯示列表,而這個頁面Asp Mvc post將項目添加到列表

我創建模型

public class Student 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 

} 

然後查看

@model IEnumerable<WebApplication1.Models.Student> 

<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Name) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Surname) 
     </th> 
     <th></th> 
    </tr> 

    @foreach (var item in Model) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.Name) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.Surname) 
      </td> 
     </tr> 
    } 
</table> 


<div class="form-horizontal"> 
    @using (Html.BeginForm()) 
    { 

     <div class="form-group"> 
      <label class="col-md-2">Имя</label> 
      @Html.TextBox("name", null, new {@class = "form-control col-lg-4"}) 
     </div> 

     <div class="form-group"> 
      <label class="col-md-2">Фамилия</label> 
      @Html.TextBox("surname", null, new {@class = "form-control col-lg-4"}) 
     </div> 
     <button type="submit" class="btn btn-default">Добавить</button> 
    } 
</div> 

<div class="panel-footer"> 
    <h3>@ViewBag.Msg</h3> 
</div> 

和控制器

List<Student> Students=new List<Student> 
    { 
     new Student() {Name = "1",Surname = "1"}, 
     new Student() {Name = "2",Surname = "2"}, 
     new Student() {Name = "3",Surname = "3"} 
    }; 
    // GET: Home 
    public ActionResult Index() 
    { 
     return View(Students); 
    } 

    [HttpPost] 
    public ActionResult Index(string name,string surname) 
    { 
     Students.Add(new Student() {Name = name,Surname = surname}); 
     @ViewBag.Msg = "User add : " + name +" "+ surname; 
     return View(Students); 
    } 

所有的工作很好,但是當創建新行我添加新行最後一行重新創建(在我的收藏中只添加一行)。我錯在哪裏?對不起我的英文不好

+0

你想要什麼? –

+0

我想按下按鈕並在我的表格中添加行 – user3351644

回答

3

這個列表是控制器類的一個私有變量,因爲在頁面的每個請求中都會創建一個控制器的新實例,列表項將每次都用它們的初始值進行初始化,然後只是將新的值添加到它。
您可以定義列表爲靜態,以防止對每個請求初始化:

static List<Student> Students=new List<Student> 
{ 
    new Student() {Name = "1",Surname = "1"}, 
    new Student() {Name = "2",Surname = "2"}, 
    new Student() {Name = "3",Surname = "3"} 
}; 
+0

對不起傢伙,如何清除文本框後發佈方法? – user3351644

+0

@ user3351644,重定向回到'Index()'方法。 –

1

你沒有在任何地方堅持你的數據,所以這將每個請求重置。此屬性:

List<Student> Students 

是一個類級屬性。它在任何時候創建類的實例時被初始化。並且爲每個向服務器發出的請求創建一個控制器類的實例。因此,這裏發生了什麼是:

  1. 用戶請求創建
  2. Controller對象的頁面,初始化列表
  3. 控制器返回列表,用戶
  4. 用戶帖子創建新項目時
  5. Controller對象,初始化列表
  6. 控制器將第4項添加到列表中
  7. 控制器向用戶返回列表

步驟4-7重複每個帖子。

爲了保留您的數據,您需要將它存儲在某個地方。數據庫是理想的。但還有其他的選擇,取決於你在做什麼的範圍。

例如,爲了測試功能,可以將其存儲在會話狀態中。在這種情況下,它將被重置爲每個用戶會話,而不是每個請求。

或者您可以創建列表static,在這種情況下,它將在整個應用程序實例中用於所有用戶。 (但不是是線程安全的。)