我在整个地方使用这种模式从数据库中获取数据并显示一个视图:
public ActionResult Index(int? id)
{
RequestViewModel model;
model = this.ClientRepository.GetRequest(id);
return View("~/Views/Requests/Index.aspx", model);
}
如果存储库返回null(如果记录不存在则是这种情况),那么我的页面会因为模型为空而崩溃并抛出错误。
我想显示一个友好的“无法找到请求的记录”消息,而不是黄色的死亡页面或通用的“发生错误”页面。
与未处理的异常相比,处理“正常”错误的推荐模式是什么?
谢谢,
瑞克
答案 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);
}