2010-12-09 4 views
2

Ich benutze dieses Muster überall Daten aus der Datenbank zu packen und eine Ansicht anzuzeigen:Cleanly Umgang mit normalen Fehlern

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

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

Wenn das Repository null zurückgibt, was der Fall ist, wenn der Datensatz nicht existiert, dann scheißt meine Seite und gibt einen Fehler aus, weil das Modell null ist.

Ich möchte eine freundliche "die angeforderte Datensatz kann nicht gefunden werden" Nachricht statt der gelben Seite des Todes oder eine generische "ein Fehler aufgetreten" Seite.

Was ist das empfohlene Muster, um "normale" Fehler im Gegensatz zu unbehandelten Ausnahmen zu behandeln?

Danke,

Rick

Antwort

1

Sie ein Action-Filter schreiben könnte:

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

Und dann Ihre Basis-Controller dekorieren mit diesem Attribut (dass alle Steuerungen von ableiten):

[NullModelChecker] 
public class BaseController: Controller 
{ } 

Auf diese Weise bleibt Ihr aktueller Code unberührt.

- UPDATE:

In ASP.NET MVC 3 könnten Sie registrieren Ihre action filter globally, ohne auch nur mit ihm Ihre Basis-Controller dekorieren. Fügen Sie einfach die folgende zu Ihrem Application_Start in Global.asax:

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

Das funktioniert für mich. Irgendein Vorschlag für eine spezifischere Fehlermeldung für einige Seiten? – rboarman

+0

@rboarman, ja innerhalb Ihres Aktionsfilters könnten Sie 'filterContext.RouteData.GetRequiredString (" action ")' und 'filterContext.RouteData.GetRequiredString (" controller ")' verwenden, um genau zu wissen, an welche Controller-Aktion ein 'null'-Modell übergeben wurde die Ansicht und basierend auf diesen Informationen die Fehlermeldung anpassen. Sie können auch Ihre 'NotFound'-Ansicht stark in ein Ansichtsmodell eingeben, das diese Informationen enthält. –

0

ich mit ASP.NET MVC nicht vertraut bin. Ich bin jedoch vertraut mit Spring MVC.

Warum können Sie nicht einfach eine einfache Wenn-sonst-Bedingung setzen? Wie dieser:

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

Das ist kein guter Vorschlag, denn wenn Sie viele Aktionen haben, würden Sie viel Wiederholungscode schreiben. –

+0

Ich dachte, er hätte nur ein paar davon. Aber da ich keine ASP.NET-Kenntnisse habe und nach dem allgemeinen Muster frage, stimme ich Ihrer Antwort zu. Ich denke, ich habe eine einfache Lösung zur Verfügung gestellt. Wenn dies Spring MVC ist, wäre das Äquivalent Ihres Vorschlags wahrscheinlich ein Interzeptor. – chris

+0

Darin ist richtig. Ich habe wahrscheinlich 50 oder mehr Metoden, die die gleiche Logik benötigen. – rboarman