Asp Mvc post添加项目到列表

本文关键字:列表 项目 添加 Mvc post Asp | 更新日期: 2023-09-27 18:11:09

我开始学习asp.net。我想在表中显示列表并在该页面上创建新行

i create model

  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);
    }

所有工作都很好,但当我添加新行最后一行重新创建(在我的集合中只添加一行)。我哪里错了?对不起,我的英语不好

Asp Mvc post添加项目到列表

该列表是控制器类的私有变量,因为在每次请求页面时,都会创建一个新的控制器实例,每次都会用它们的初始值初始化列表项,然后只将新值添加到它。
您可以将列表定义为静态,以防止对每个请求进行初始化:

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"}
}; 

您没有在任何地方持久化您的数据,因此它将在每次请求时重置。这个属性:

List<Student> Students

是一个类级属性。每当创建类的实例时,它都会初始化。并且为向服务器发出的每个单独请求创建一个控制器类的实例。所以这里发生的是:

  1. 用户请求页面
  2. 创建控制器对象,初始化列表
  3. 控制器返回列表给用户
  4. 用户发布新条目
  5. 创建控制器对象,初始化列表
  6. 控制器将第4项添加到列表
  7. 控制器返回列表给用户

步骤4-7重复每个帖子。

为了保留你的数据,你需要把它存储在某个地方。数据库是理想的选择。但也有其他的选择,这取决于你正在做的事情的范围。

例如,为了测试功能,您可以将其存储在会话状态中。在这种情况下,它将为每个用户会话重置,而不是为每个请求重置。

或者您可以将列表设置为static,在这种情况下,它将在整个应用程序实例中用于所有用户。(但不会是线程安全的。)