【问题标题】:Best ASP.NET MVC practice to distinguish GET/POST action methods with same signature?区分具有相同签名的 GET/POST 操作方法的最佳 ASP.NET MVC 实践?
【发布时间】: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


【解决方案1】:

在控制器中给方法一个唯一的名称,例如添加“_POST”作为后缀。然后,您可以使用 [ActionName("actualname")] 属性将您的方法标记为您的操作使用的名称。

【讨论】:

【解决方案2】:

我会将它们合二为一:

public ActionResult Edit(string id)
{
    if (Request.HttpMethod == "GET") {
        var user = Entities.Users.SingleOrDefault(s => s.UserID == id);
        return View(user);
    }

    // POST logic
}

【讨论】:

  • 这感觉与采取单一职责的精益行动背道而驰。
【解决方案3】:

帖子应具有模型 IMO 中的 id:

[HttpGet]
public ActionResult Edit(string id)
{
    var user = Entities.Users.SingleOrDefault(s => s.UserID == id);
    return View(user);
}

[HttpPost]
public ActionResult Edit(User user)
{        
    if (TryUpdateModel<User>(user, new[] { "Email", "FullName" }))
    {
        Entities.SaveChanges();
        RedirectToAction("Index");
    }
    return View(user);
}

【讨论】:

  • 所以在你的情况下用户不是来自数据库。 SaveChanges 将不起作用。如果您将用户作为操作参数,则不确定为什么要使用 TryUpdateModel。
【解决方案4】:

为什么不

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(string id,FormCollection form)  

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Edit(string id)  

这将导致适当的 HTTP 请求被正确的方法处理

【讨论】:

  • 因为你不能重载使用相同签名的方法。从 C# 的角度来看,您尝试定义相同的函数两次。
猜你喜欢
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多