【问题标题】:Sending List from View to Controller results in null List in MVC将列表从视图发送到控制器导致 MVC 中的空列表
【发布时间】:2016-10-20 12:35:38
【问题描述】:

我正在尝试在 MVC 中创建一个用户列表,其中有一个按钮可以添加随机生成的用户,并且每个用户都有一个删除按钮可以将它们从列表中删除。 我将它从控制器发送到视图并生成一个用户。当我尝试再添加一个时,它只是改变了它。我猜它会删除列表中的项目。 我正在尝试将列表传递回控制器,但它不起作用。 有人可以帮忙吗?

我的模特:

public class UsersClass
{
    public int Code { get; set; }
    public string Name { get; set; }

    public UsersClass(int Code, string Name)
    {
        this.Code = Code;
        this.Name = Name;
    }
}

我的控制器:

List<UsersClass> UsersList = new List<UsersClass>();
public ActionResult Index()
{
    return View(UsersList);
}

[HttpPost]
    public ActionResult AddUser(List<UsersClass> UsersList)
    {
        if (UsersList == null)
        {
            int a = 123;
            UsersList = new List<UsersClass>();
        }
        Random generator = new Random();

        string[] vez_nevek = new string[10] { "Kovács", "Szekeres", "Király", "Szabó", "Vicha", "Kozma", "Ferencz", "Pócsi", "Tinka", "Horváth" };
        string[] ker_nevek = new string[10] { "Lajos", "Barnabás", "Róbert", "Balázs", "János", "Béla", "Petra", "Anna", "Ferenc", "Attila" };

        string vezetek_nev = vez_nevek[generator.Next(vez_nevek.Length)];
        string kereszt_nev = ker_nevek[generator.Next(ker_nevek.Length)];

        UsersList.Add(new UsersClass(generator.Next(100000, 999999), vezetek_nev + " " + kereszt_nev)); 

        return View("~/Views/UserManagement/Index.cshtml", UsersList);
    }

和我的视图添加一个用户:

<h2>User Management</h2>

@using (Html.BeginForm("AddUser", "UserManagement", FormMethod.Post))
{
   int index = 0;
   foreach (var item in Model)
   {
       Html.Hidden("item[" + index + "].Code", item.Code);
       Html.TextBox("item[" + index + "].Name", item.Name);
       index++;
   }
   <input type="submit" value="Add User" />
}

【问题讨论】:

  • 您尝试生成与您的模型无关且永远不会绑定到它的 name 属性(并且您显示的代码甚至不会生成任何 html,因为缺少 @@Html.Hidden(...))。使用@for(int i = 0; i &lt; Model.Count; i++) { @Html.HiddenForm(m =&gt; m[i].Code) @Html.TextBoxFor(m =&gt; m[i].Name) } 正确生成视图。然后参考this answer

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:

您的 HttpPost 方法 AddUser 不知道该列表。您应该创建一个包含用户列表的 ViewModel。 ViewModel 是 View 和 Controller 之间通信数据的一种方式。用户在页面上编辑模型,当他们单击保存/删除时,将调用该控制器的 HttpPost 方法。在 HttpPost 方法中创建一个参数,即模型。 View 知道 ViewModel 并将其发送给控制器。请参阅下面的代码。

视图模型:

public class UserManageViewModel
    {
        public List<UsersClass> users {get; set;}
    }

查看: @model UserManageViewModel 行对于您的视图至关重要,否则它将不知道要向控制器发送什么。

@model UserManageViewModel
<h2>User Management</h2>

@using (Html.BeginForm("AddUser", "UserManagement", FormMethod.Post))
{
   int index = 0;
   foreach (var item in Model.users)
   {
       Html.Hidden("item[" + index + "].Code", item.Code);
       Html.TextBox("item[" + index + "].Name", item.Name);
       index++;
   }
   <input type="submit" value="Add User" />
}

控制器:

public ActionResult Index()
{
    UserManageViewModel model = new UserManageViewModel();
    model.users = new List<UsersClass>();
    return View(model);
}

[HttpPost]
    public ActionResult AddUser(UserManageViewModel model)
    {
        if (model.users.IsEmpty() || model.users == null)
        {
            int a = 123;
            model.users = new List<UsersClass>();
        }
        Random generator = new Random();

        string[] vez_nevek = new string[10] { "Kovács", "Szekeres", "Király", "Szabó", "Vicha", "Kozma", "Ferencz", "Pócsi", "Tinka", "Horváth" };
        string[] ker_nevek = new string[10] { "Lajos", "Barnabás", "Róbert", "Balázs", "János", "Béla", "Petra", "Anna", "Ferenc", "Attila" };

        string vezetek_nev = vez_nevek[generator.Next(vez_nevek.Length)];
        string kereszt_nev = ker_nevek[generator.Next(ker_nevek.Length)];

        model.users.Add(new UsersClass(generator.Next(100000, 999999), vezetek_nev + " " + kereszt_nev)); 

        return View(model);
    }

希望这会有所帮助。干杯:)

【讨论】:

    【解决方案2】:

    你应该将所有输入命名为相同的

    @Html.TextBox("UsersList", item.Name);
    

    - 动作方法

    public ActionResult AddUser(List<string> UsersList){
    

    }

    【讨论】:

    • 仍然以空列表返回控制器。 @using (Html.BeginForm("AddUser", "UserManagement", FormMethod.Post)) { foreach (var item in Model) { @Html.Hidden("UsersList", item.Code); @Html.Hidden("UsersList", item.Name); } }
    • 仍然以空列表返回控制器。我用过:@Html.Hidden("UsersList", item.Code); @Html.Hidden("UsersList", item.Name);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 2012-07-16
    相关资源
    最近更新 更多