gpt4 book ai didi

c# - 对象列表的回发为空

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:20 24 4
gpt4 key购买 nike

我有一个 MVC 4 博客应用程序,我正在尝试添加一个允许管理员编辑/删除已注册帐户的管理面板。我有 View 和模型,但我无法弄清楚为什么我的模型没有被正确传达。这是我的代码:

首先,我的管理面板有一个简单的 ViewModel。它仅包含一个列表,其中包含网络应用程序的所有注册用户。

    public class AdminViewModel
{

public List<User> UserList { get; set; }
}

这是我的 Controller ,它以列表的形式获取用户并将它们发送到管理 View

[HttpGet]
public ActionResult Admin()
{
AdminViewModel avm = new AdminViewModel();
avm.UserList = Db.Users.ToList();
return View(avm);
}

然后这是我的 View ,它显示了所有帐户信息,有一个用于删除用户的删除链接,以及一些用于更改用户能力的复选框。

@using cpts483.Models.ViewModels
@using cpts483.Models

@model AdminViewModel

<h1>Admin Control Panel</h1>

@using (@Html.BeginForm("UpdateUsers", "Home", FormMethod.Post))
{
<table>
<tr>
<th></th>
<th>Id</th>
<th>Email</th>
<th>First Name</th>
<th>Last Name</th>
<th>IsAdmin</th>
<th>CanWriteArticles</th>
</tr>
<tbody>
@foreach (User u in Model.UserList)
{
<tr>
<td>
@Html.ActionLink("Delete", "DeleteUser", new {id = u.Id})
</td>
<td>@u.Id</td>
<td>@u.Email</td>
<td>@u.FirstName</td>
<td>@u.LastName</td>
<td>
@Html.CheckBoxFor(m => m.UserList.Find(us => us.Id == u.Id).IsAdmin)
</td>
<td>
@Html.CheckBoxFor(m => m.UserList.Find(us => us.Id == u.Id).CanWriteArticles)
</td>
</tr>
}
</tbody>
</table>
<input type="submit" value="Save Changes" id="update-users-btn" />
}

现在,我认为这会将我的 AdminViewModel.UserList 绑定(bind)到 DOM 中的复选框,然后当他提交表单时,相同的 AdminViewModel 将连同更新后的数据一起发送到我的回发处理程序.但是,下面的处理程序有一个每次都为 null 的 AdminViewModel 参数,而不是那样。我在这里做错了什么?

[HttpPost]
public ActionResult UpdateUsers(AdminViewModel avm) // THIS avm IS ALWAYS NULL
{
foreach (User u in avm.UserList)
{
Db.Users.Attach(u);
}

Db.SaveChanges();
return RedirectToAction("Admin");
}

最佳答案

我为你做了一个小原型(prototype),检查一下 -

让你的模型如下图所示。为了简单起见,我忽略了一些属性。

public class AdminViewModel
{
public List<User> UserList { get; set; }
}
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public bool IsAdmin { get; set; }
}

然后是将呈现 View 的 Controller 操作 -

    public ActionResult Index()
{
AdminViewModel model = new AdminViewModel();
model.UserList = new List<User>();
model.UserList.Add(new User() { FirstName = "Rami", IsAdmin = true, Id = 10 });
model.UserList.Add(new User() { FirstName = "James", IsAdmin = false, Id = 20 });
return View(model);
}

那么你的 View 应该如下图所示。我使用 hiddenFields 来保留一些文本属性。

@model MVC.Controllers.AdminViewModel

@{
ViewBag.Title = "Index";
}

<h2>Index</h2>

@using (Html.BeginForm("Submit", "Person", FormMethod.Post))
{

<table>
@for (int i = 0; i < Model.UserList.Count; i++)
{
<tr>
<td>
@Html.DisplayFor(modelItem => Model.UserList[i].Id)
@Html.HiddenFor(modelItem => Model.UserList[i].Id)
</td>
<td>
@Html.DisplayFor(modelItem => Model.UserList[i].FirstName)
@Html.HiddenFor(modelItem => Model.UserList[i].FirstName)
</td>
<td>
@Html.CheckBoxFor(modelItem => Model.UserList[i].IsAdmin)
</td>
</tr>
}
</table>
<input type="submit" value="Save" />
}

单击提交按钮时,它将触发以下 Controller 操作 -

    public ActionResult Submit(AdminViewModel model)
{
return View();
}

当你放置一个断点时,你可以看到你持久化的模型如下 -

enter image description here

关于c# - 对象列表的回发为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21945570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com