最近在筹备本人博客下版本的开发工作,准备将网站前台转到MVC3上。以前没有彻底玩过MVC,所以这几天在做练习,比较蛋疼。其中一个需求就是当用户访问不正确的地址时,返回一个404错误。比如阅读一篇已被删除的文章,就需要这样做。

以前在ASP.NET里,我只需要写:Response.StatusCode = 404 就好了,但在MVC3里似乎无效。经过Google我找到了返回404错误的方法。完整代码如下:

public ActionResult Detail(string id)
{
    Guid sId = Guid.Empty;
    if (!Guid.TryParse(id, out sId))
    {
        return new HttpNotFoundResult();
    }
    else
    {
        return View(optStudent.GetModel(sId));
    }
}

用户将访问“http://localhost:8002/HelloWorld/Detail/77b5578e-1584-4762-8208-cfa1d5481f0f”这样的地址,一旦Guid匹配失败,就返回404错误。关键在于“return new HttpNotFoundResult();”,在MVC3里,HttpNotFoundResult继承自HttpStatusCodeResult,而HttpStatusCodeResult又继承自ActionResult。方法的返回类型是ActionResult,因此我们返回它的之类HttpNotFoundResult是可以的,毕竟HttpNotFoundResult is-a ActionResult。

类似的,我们也可以返回其他类型的错误码,并在web.config里做自定义error的设置,就像以前在ASP.NET里做的一样。

其他错误码,我们可以通过HttpStatusCodeResult来返回,比如:

return new HttpStatusCodeResult(500);