2010-12-09 5 views
2

나는 데이터베이스에서 데이터를 잡고보기 표시 사방이 패턴을 사용 저장소에 레코드가 존재하지 않는 경우는 어떤 경우인지, null을 반환하는 경우깔끔하고 처리 일반 오류

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

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

을, 모델이 null이기 때문에 내 페이지가 엉망이고 오류가 발생합니다.

죽음의 노란색 페이지 또는 일반적인 "오류가 발생했습니다"페이지 대신 친숙한 "요청 된 레코드를 찾을 수 없습니다"라는 메시지를 표시하고 싶습니다.

처리되지 않은 예외와 달리 "정상적인"오류를 처리하는 데 권장되는 패턴은 무엇입니까?

감사합니다,

당신은 액션 필터를 쓸 수

답변

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 
{ } 

이렇게하면 현재 코드가 변경되지 않습니다.

- UPDATE :

ASP.NET에서 MVC 3 등록 할 수 귀하의 action filter globally 심지어하여 기본 컨트롤러를 장식없이. 간단히 Global.asaxApplication_Start에 다음을 추가

GlobalFilters.Filters.Add(new NullModelCheckerAttribute()); 
+0

이 나를 위해 작동합니다. 일부 페이지에 대한보다 구체적인 오류 메시지에 대한 제안 사항이 있습니까? – rboarman

+0

@ rboarman, 네 액션 필터 안에 네가'null' 모델을 전달한 컨트롤러 액션을 정확히 알기 위해서'filterContext.RouteData.GetRequiredString ("action")'과'filterContext.RouteData.GetRequiredString ("controller")를 사용할 수있다. 보기 및이 정보를 기반으로 오류 메시지를 사용자 정의합니다. 'NotFound' 뷰는이 정보를 포함하는 뷰 모델에 강하게 입력 할 수도 있습니다. –

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); 
} 
+0

많은 제안을하면 많은 반복적 인 코드를 작성하게되므로 좋은 제안이 아닙니다. –

+0

나는 그가 이것들 중 단지 몇 가지를 가지고 있다고 생각했다. 하지만 어쨌든 ASP.NET에 익숙하지 않은 그는 일반적인 패턴을 요구하고 있기 때문에 대답에 동의합니다. 나는 단순한 해결책을 제공했다고 생각한다. 이것이 Spring MVC라면 제안에 해당하는 것은 아마도 인터셉터 일 것입니다. – chris

+0

Darin이 맞습니다. 나는 아마도 동일한 논리가 필요한 50 개 이상의 metod를 가지고있을 것이다. – rboarman