Asp.net mvc 2 asp.net MVC 2-隔离保护代码的最优雅方式-防止空控制器参数

Asp.net mvc 2 asp.net MVC 2-隔离保护代码的最优雅方式-防止空控制器参数,asp.net-mvc-2,aop,cross-cutting-concerns,Asp.net Mvc 2,Aop,Cross Cutting Concerns,我有一个非常简单的问题,但我正在寻找以下“最佳”解决方案: 我有多个控制器动作,如下所示: public ActionResult DoSomething(PackageViewModel packageByName, DoSomethingInputModel inputModel) { if (packageByName == null) { Response.StatusCode = 404; Response.StatusDescripti

我有一个非常简单的问题,但我正在寻找以下“最佳”解决方案:

我有多个控制器动作,如下所示:

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这样的AOP工具
  • 动作过滤器
  • 其他的

事实上,
ActionFilter
是一个AOP。如果参数不是
null
,则将自己的
ActionFilter
实现写入chceck。如果您总是需要在控制器执行过程中检查相同的内容,那么这是最好的方法。它易于编写,可在整个应用程序中恢复,非常适合MVC2。

以下是我实现的内容(基于@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);
    }
}
(勾选)如果有人在he实施细节方面遇到困难,请参阅我的答案。