区分具有相同签名的 GET/POST 操作方法的最佳 ASP.NET MVC 实践?

发布于 2024-09-07 15:00:29 字数 676 浏览 4 评论 0原文

在实现编辑操作时,我为 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);
}

有更好/更干净的方法来实现编辑操作吗?

When implementing Edit action, I add two methods for Get and Post: Edit(string id)

Ideally, they need have same signature. But of course this is not compilable. So I add a dummy parameter to HttpPost method (form in my case):

[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);
}

Any better/cleaner way to implement Edit action?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

对岸观火 2024-09-14 15:00:29

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

Give the methods a unique name in the controller e.g. add "_POST" as a suffix. You can then use the [ActionName("actualname")] attribute to mark you method with the name your action use.

神仙妹妹 2024-09-14 15:00:29

我会把它们合二为一:

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

    // POST logic
}

I would combine them into one:

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

    // POST logic
}
习惯成性 2024-09-14 15:00:29

帖子应该在 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);
}

The Post should have the id in a Model IMO:

[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);
}
皓月长歌 2024-09-14 15:00:29

为什么不呢

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

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

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

Why not

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

and

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

This will cause the appropriate HTTP request to be handled by the proper method

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文