干净地处理正常错误

时间:2010-12-09 23:39:08

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

我在整个地方使用这种模式从数据库中获取数据并显示一个视图:

    public ActionResult Index(int? id)
    {
        RequestViewModel model;
        model = this.ClientRepository.GetRequest(id);

        return View("~/Views/Requests/Index.aspx", model);
    }

如果存储库返回null(如果记录不存在则是这种情况),那么我的页面会因为模型为空而崩溃并抛出错误。

我想显示一个友好的“无法找到请求的记录”消息,而不是黄色的死亡页面或通用的“发生错误”页面。

与未处理的异常相比,处理“正常”错误的推荐模式是什么?

谢谢,

瑞克

2 个答案:

答案 0 :(得分:1)

你可以写一个动作过滤器:

public class NullModelCheckerAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var viewResult = filterContext.Result as ViewResultBase;
        if (viewResult != null && viewResult.ViewData.Model == null)
        {
            // If the action selected a view to render and passed a null model
            // render the NotFound.aspx view
            var result = new ViewResult();
            result.ViewName = "~/Views/Errors/NotFound.aspx";
            filterContext.HttpContext.Response.StatusCode = 404;
            filterContext.Result = result;
        }
    }
}

然后使用以下属性装饰您的基本控制器(所有控制器派生出来):

[NullModelChecker]
public class BaseController: Controller
{ }

这样,您当前的代码保持不变。

- 更新:

在ASP.NET MVC 3中,您可以注册action filter globally,甚至不用它来装饰您的基本控制器。只需将以下内容添加到Application_Start中的Global.asax

即可
GlobalFilters.Filters.Add(new NullModelCheckerAttribute());

答案 1 :(得分:0)

我不熟悉ASP.NET MVC。我对Spring MVC很熟悉。

为什么你不能只提出一个简单的if-else条件?像这样:

public ActionResult Index(int? id)
{
    RequestViewModel model;
    model = this.ClientRepository.GetRequest(id);

    if (model == null) {
        return View("~/Views/Requests/FriendlyError.aspx");
    }

    return View("~/Views/Requests/Index.aspx", model);
}