【发布时间】:2010-07-02 15:31:01
【问题描述】:
在实现 Edit 动作时,我为 Get 和 Post 添加了两个方法:Edit(string id)
理想情况下,它们需要具有相同的签名。但当然这是不可编译的。所以我在 HttpPost 方法中添加了一个虚拟参数(在我的例子中是 form):
[HttpGet]
public ActionResult Edit(string id)
{
var user = Entities.Users.SingleOrDefault(s => s.UserID == id);
return View(user);
}
[HttpPost]
public ActionResult Edit(string id, FormCollection form)
{
var user = Entities.Users.SingleOrDefault(s => s.UserID == id);
if (TryUpdateModel<User>(user, new[] { "Email", "FullName" }))
{
Entities.SaveChanges();
RedirectToAction("Index");
}
return View(user);
}
有更好/更简洁的方式来实现编辑操作吗?
【问题讨论】:
-
为什么它们会有相同的签名,一个需要一个 ID 来显示编辑表单,另一个应该使用你正在编辑的域/视图模型对象?您不妨让 ASP.NET 为您填充对象,而不是自己编写样板代码。
-
我确实让 asp.net 使用 TryUpdateModel 填充。这不是编辑模型的正确方法(在我的例子中是用户实体)
-
让您的操作将
User的实例作为参数。它会为您节省手动填充步骤。 -
如果我使用编辑(用户用户),那么 ASP.NET 将如何知道我需要从数据库(按 ID)获取实际用户实例并从表单中更新字段?这就是为什么我从 EF 查询用户实例,然后更新它。任何示例或链接?
-
它不会知道,它会创建一个新的断开连接的实例并用表单数据填充它。您仍然需要自己检索数据库数据。另一种选择是,由于您只允许更新两个字段,因此您可以有一个将两个字段(和 ID)作为参数的操作。
标签: asp.net-mvc-2 model controller action