【发布时间】:2016-01-14 09:08:29
【问题描述】:
我环顾四周,发现很多人都遇到过这个问题。然而我的并不完全相同。虽然其他问题通常通过使用正确的 ActionLink 方法重载来解决,并通过确保方法中接收到的对象类型正确来解决,但这不是来的。
在这个示例代码中,变量根据所有其他来源都设置正确,但是方法中接收的用户对象始终为空。
我做了什么:
- 检查放在 ActionLink 上的对象是否有数据(有)
- 检查我收到的对象的类型是否正确,以及我发送的对象是否正确
- 尝试改用 Ajax ActionLink 和 HttpPost 方法
这是代码先从后端,然后是前端
public void DeleteUser(User user)
{
using (EFEntity context = new EFEntity())
{
context.User.Attach(user);
context.User.Remove(user);
context.SaveChanges();
Response.Redirect("~/Home/someView");
}
}
动作链接前端:
foreach (User user in Model.userList)
{
<tr>
<td>
@{
number = number + 1;
}
@number
</td>
<td>@user.Gid</td>
<td>@user.Name</td>
<td>@user.Email</td>
<td>@user.Permissions.Perm</td>
<td>@user.LastUpdated</td>
<td>
@Html.ActionLink("Delete", "DeleteUser", "Service", user, new { @class = "btn btn-danger" })
</td>
</tr>
}
【问题讨论】:
-
您不应该在
ActionLink()中传递复合体。如果对象有很多属性,您很容易超过查询字符串并抛出异常(并且它创建的丑陋查询字符串)。您应该只传递用户的ID属性。 -
而且您甚至不应该使用操作链接 - 您正在修改数据,因此它应该是 POST - 目前它添加了用户浏览器历史记录,并且可以轻松地再次导航到。充其量这将意味着进行不必要的数据库调用以删除当前不存在的内容,最坏的情况可能会引发异常。强烈建议您遵循常规做法。
-
@StephenMuecke 请详细说明转发和浏览器历史记录,不清楚您的意思。当您单击此按钮时,它会刷新页面,因此您无法选择两次删除相同的内容。还是我误解了你的意思?
-
它是一个链接。任何使用都可以在地址栏中输入。当用户单击链接时,您的糟糕地址将被添加到他们的浏览器历史记录中,这意味着他们可以轻松打开浏览器历史记录页面并再次单击它(导致删除不再存在的内容 - 并可能引发异常)应该在循环中生成一个表单 - @Html.BegnForm("DeleteUser", "Service", new { ID = user.ID }, FormMethod.Post, null)) { }` 并将方法更改为
[HttpPost] public ActionResult DeleteUser(int ID) -
如果你在发帖,那么通过模型(除了通过网络发送的微不足道的额外数据)没有任何不利之处,但它是不必要的。删除实体所需的只是 ID - 例如 this answer
标签: c# .net asp.net-mvc entity-framework actionlink