2010-12-09 6 views
2

J'utilise ce modèle dans tous les sens pour saisir les données de la base de données et afficher une vue:manipulation Proprement erreurs normales

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

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

Si le référentiel renvoie null, ce qui est le cas si le dossier n'existe pas, alors ma page craps dehors et jette une erreur parce que le modèle est nul. Je voudrais montrer un message amical «l'enregistrement demandé ne peut pas être trouvé» au lieu de la page jaune de la mort ou une page générique «une erreur s'est produite».

Quel est le modèle recommandé pour gérer les erreurs «normales» par opposition aux exceptions non gérées?

Merci,

Rick

Répondre

1

Vous pouvez écrire un filtre d'action:

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

Et puis décorer votre contrôleur de base (que tous vos contrôleurs dérivent) avec cet attribut:

[NullModelChecker] 
public class BaseController: Controller 
{ } 

De cette façon, votre code actuel reste inchangé.

- MISE À JOUR:

Dans ASP.NET MVC 3, vous pouvez enregistrer votre action filter globally sans décorer même votre contrôleur de base avec elle. Ajoutez simplement ce qui suit à votre Application_Start dans Global.asax:

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

Cela fonctionne pour moi. Une suggestion pour un message d'erreur plus spécifique pour certaines pages? – rboarman

+0

@rboarman, oui dans votre filtre d'action, vous pouvez utiliser 'filterContext.RouteData.GetRequiredString (" action ")' et 'filterContext.RouteData.GetRequiredString (" controller ")' pour savoir exactement quelle action de contrôleur a passé un modèle 'null' à la vue et sur la base de cette information personnaliser le message d'erreur. Vous pouvez également rendre votre vue 'NotFound' fortement typée sur un modèle de vue contenant cette information. –

0

Je ne suis pas familier avec ASP.NET MVC. Je suis familier avec Spring MVC. Pourquoi ne pouvez-vous pas simplement mettre une simple condition if-else? Comme celui-ci:

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

Ce n'est pas une bonne suggestion car si vous avez beaucoup d'actions, vous écrivez beaucoup de code répétitif. –

+0

Je pensais qu'il n'en avait que quelques-uns. Mais de toute façon puisque je n'ai aucune connaissance d'ASP.NET et qu'il demande le schéma général, je suis d'accord avec votre réponse. Je pense que j'ai fourni une solution simpliste. Si c'est Spring MVC, l'équivalent de votre suggestion serait probablement un intercepteur. – chris

+0

Darin a raison. J'ai probablement 50 métodes ou plus qui ont besoin de la même logique. – rboarman