如果用户使用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");
}
答案 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。
不要害怕使用多条路线。对于现实生活应用,这很常见。