c# - 当我在 asp.net mvc Controller 操作中验证失败时,如何保留我的 url

标签 c# asp.net-mvc

如果我从详细信息页面开始:

http:\\www.mysite.com\App\Detail

我有一个名为Update 的 Controller 操作,它通常会调用redirectToAction 返回详细信息 页面。但是我在验证中发现了一个错误,我需要在重定向之前返回(以避免丢失我所有的 ModelState)。这是我的 Controller 代码:

 public override ActionResult Update(Application entity)
    {
        base.Update(entity);
        if (!ModelState.IsValid)
        {
            return View("Detail", GetAppViewModel(entity.Id));
        }
      return RedirectToAction("Detail", new { id = entity.Id }) 

但现在我看到带有验证错误消息的 View (因为我正在使用 HTML.ValidationSummary() )但是 url 看起来像这样:

http:\\www.mysite.com\App\Update

我是否可以在不将 modelstate 放入某些临时变量的情况下避免更改 URL?这里是否有最佳实践,因为我看到的唯一示例是在调用 redirectToAction 之间将 ModelState 放入某些 tempdata 中。

最佳答案

从 ASP.NET MVC 2 开始,当 return View() 从另一种 Action 方法。

因此,推荐的解决方案和 ASP.NET MVC 中普遍接受的约定是有一个相应的、名称相似的操作方法,它只接受 HTTP POST 动词。因此,在您的情况下,使用另一个名为 Detail 的操作方法应该可以解决您在验证失败时使用不同 URL 的问题。

[HttpPost]
public ActionResult Detail(Application entity)
{
    base.Update(entity);
    if (ModelState.IsValid)
    {
        //Save the entity here
    }
   return View("Detail", new { id = entity.Id });
}  

此解决方案符合 ASP.NET MVC 最佳实践,也避免了摆弄 modestatetempdate

此外,如果您还没有研究过此选项,那么 asp.net mvc 中的客户端验证 也可能提供一些关于您的 URL 问题的解决方案。我强调一些,因为当浏览器禁用 javascript 时,这种方法将不起作用。

因此,最好的解决方案是有一个名为 Detail 的操作方法,但只接受 HTTP POST 动词。

关于c# - 当我在 asp.net mvc Controller 操作中验证失败时,如何保留我的 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3289179/

相关文章:

c# - 为什么在 C# 中使用泛型约束

c# - 任何工具说明每种方法需要多长时间运行?

c# - .NET 中 SerialPort 类的问题

c# - 在 Winforms 的标签上使用自定义字体

c# - 如何在 C# 中比较 2 个 DateTime

jquery - 跨域发布到 ASP.Net MVC 应用程序

c# - asp.net mvc中依赖解析和IoC的优势

asp.net - 如何消除服务器上 url 开头的 "www."?

c# - 允许 .NET MVC (C#) Web 应用程序接受外语

c# - 错误 : The EntityFramework package is not installed on project