如何在路由上处理null {id}?

时间:2010-03-11 17:23:06

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

如果用户使用http://www.mysite.com/Quote/Edit而不是http://www.mysite.com/Quote/Edit/1000访问我的网站会怎样?换句话说,他们没有为{id}指定值。如果他们不这样做,我想显示一个漂亮的“未找到”页面,因为他们没有提供ID。我当前通过接受一个可以为null的int作为Controller Action中的参数来处理这个问题,它工作正常。但是,我很好奇是否有更标准的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");
    }

3 个答案:

答案 0 :(得分:2)

您的其他选择将是

  • 有两个Edit个动作;一个int id作为参数,另一个没有任何参数。
  • 只有Edit(int id)作为您的操作,并让控制器的HandleUnknownAction方法执行您未找到实体时应该执行的操作(这有点复杂)。

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

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

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

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

答案 1 :(得分:0)

你的方式没有真正的问题,但在语义上它并不是一个无效的引号,它已导航到一条他们不应该去的无效路线。

在这种情况下,我倾向于重定向到/ quote,如果你真的想向用户显示一条消息,只显示错误横幅或类似信息(假设你在母版页中有这样的功能等)。

    public ActionResult Edit(int? id) 
    { 
        if (id == null) 
        {
            // You will need some framework in you master page to check for this message.
            TempData["error"] = "Error Message to display";
            return RedirectToAction("Index"); 
        }

        ... 
    }

答案 2 :(得分:0)

使用路线约束

您始终可以在routes.MapRoute()调用中定义路径约束,该约束不会通过任何未定义(或非数字)id的请求传递:

new { id = "\d+" }

这是一个正则表达式,用于检查id的值是否为数字。

您可能必须创建一个定义此路径的新路由,因为对于其他控制器操作,您可能不希望路由未定义。在这种情况下,您的控制器操作不需要可为空的参数,因为将始终定义id。

不要害怕使用多条路线。对于现实生活应用,这很常见。