asp.net MVC 2 - самый элегантный способ изоляции защитного кода - защита от нулевых параметров контроллера - PullRequest
2 голосов
/ 16 августа 2010

У меня очень простая проблема, но я ищу «лучшее» решение для следующего:

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

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

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

  • Я могу сделать функцию
  • Я могу использовать инструмент AOP, такой как PostSharp
  • ActionFilter
  • Другое?

Ответы [ 2 ]

2 голосов
/ 16 августа 2010

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

0 голосов
/ 17 августа 2010

Вот что я реализовал (основываясь на ответе @ Ł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);
    }
}
...