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

Mat*_*lay 5 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");
    }
Run Code Online (Sandbox Code Playgroud)

Çağ*_*kin 2

你的其他选择是

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

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

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

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

var viewModel = new QuoteViewModel(this.UserId);
viewModel.LoadQuote(id.Value);
//...
Run Code Online (Sandbox Code Playgroud)