2010-08-16 2 views
2

у меня есть очень простая задача, но я ищу для «лучшего» решения к следующему:asp.net MVC 2 - самый элегантный способ выделения кода охраны - защиты от параметров нуля контроллера

У меня есть несколько контроллеров действуют примерно так:

public ActionResult DoSomething(PackageViewModel packageByName, DoSomethingInputModel inputModel) 
{ 
    if (packageByName == null) 
    { 
     Response.StatusCode = 404; 
     Response.StatusDescription = "Package not found : " + RouteData.GetRequiredString("packageName"); 
     return View("Error"); 
    } 
    ... 

Каков наилучший способ изолировать эту проблему?

  • Я могу сделать функцию
  • я могу использовать инструмент АОП как PostSharp
  • ActionFilter
  • Другое?

ответ

2

Фактически ActionFilter является АОП. Напишите свою собственную реализацию ActionFilter для chceck, если параметр не null. Если вам всегда нужно проверять одно и то же в начале исполнения вашего контроллера, это лучший способ. Это легко писать, resusable в целом применении и очень MVC 2.

+0

(отметьте) Если кто-то борется с деталями реализации, см. Также мой ответ. – Myster

0

Вот что я реализовал (на основе @ ŁukaszW.pl ответа)
Надеюсь, это сэкономит кому-то какое-то время.

public class GuardAgainstNullPackage : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     BookingController controller = ((BookingController)filterContext.Controller); 
     if (filterContext.ActionParameters["packageByName"] == null || !(filterContext.ActionParameters["packageByName"] is PackageViewModel)) 
     { 
      controller.Response.StatusCode = 404; 
      controller.Response.StatusDescription = "Package not found : " + filterContext.RouteData.GetRequiredString("packageName"); 
      filterContext.Result = new ViewResult() { ViewName = "Error" }; 
     } 
     base.OnActionExecuting(filterContext); 
    } 
}