asp.net-mvc - 如何处理路由上的 null {id}?

标签 asp.net-mvc asp.net-mvc-routing

如果用户使用 http://www.mysite.com/Quote/Edit 访问我的网站怎么办?而不是http://www.mysite.com/Quote/Edit/1000换句话说,它们没有指定 {id} 的值。如果他们不这样做,我想显示一个漂亮的“未找到”页面,因为他们没有提供 ID。我目前通过接受可为空的 int 作为 Controller 操作中的参数来处理此问题,并且工作正常。然而,我很好奇是否有更标准的 MVC 框架方法来处理这个问题,而不是我目前使用的代码(见下文)。是处理这个问题的更顺利的方法,还是这是正确的方法?

    [HttpGet]
    public ActionResult Edit(int? id)
    {
        if (id == null)
            return View("QuoteNotFound");

        int quoteId = (int)id;

        var viewModel = new QuoteViewModel(this.UserId);
        viewModel.LoadQuote(quoteId);
        if (viewModel.QuoteNo > 0)
        {
            return View("Create", viewModel.Quote.Entity);
        }
        else
            return View("QuoteNotFound");
    }

最佳答案

您的其他选择是

  • 有两个 Edit 操作;一个以 int id 作为参数,另一个不带任何参数。
  • 仅将 Edit(int id) 作为您的操作,并让 Controller 的 HandleUnknownAction 方法在找不到您的实体时执行其应该执行的操作(这是一个有点复杂)。

但我最喜欢你的方法,因为它简单且能正确处理情况。

顺便说一句,您不需要该局部变量,您可以这样做以获得更好的可读性:

//...
if (!id.HasValue)
    return View("QuoteNotFound");

var viewModel = new QuoteViewModel(this.UserId);
viewModel.LoadQuote(id.Value);
//...

关于asp.net-mvc - 如何处理路由上的 null {id}?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2427179/

相关文章:

asp.net-mvc - 如何在 MVC3 的自定义路由处理程序中指定命名空间?

c# - 生成替换一个参数的路由

asp.net-mvc - 为什么 MVC 4 Web API 匹配来自 GET 请求正文的操作参数?

asp.net-mvc - 如何从 MVC3 中的区域 Controller 中出来?

jquery - ASP.NET MVC 文件下载和 jQuery 参数

asp.net-mvc - 将字符串数组参数传递给 MVC Controller

asp.net-mvc - 如何防止 ASP.net WP 因错误而终止

asp.net-mvc - 更正缺少 ASP.Net MVC Controller 的 404 消息

asp.net - 根据 Controller 指定不同的 _Layout.cshtml

c# - 遍历列表并将值添加到二维数组