带控制器/操作名称的ASP.NET MVC自定义筛选器属性

时间:2013-03-15 17:56:34

标签: asp.net-mvc actionfilterattribute

我有一个自定义ActionFilterAttribute类,它将用户发送到错误屏幕,其中包含返回上一页的链接。

此属性接受两个控制器/操作对:一个用于错误屏幕操作(通常是相同的应用程序范围),另一个用于返回操作(通常对于控制器中的所有操作都相同)。我的想法是,当发生错误时,我不希望我的用户感到迷失,因为他们没有办法重新进入应用程序。

现在我有四个属性:两个用于控制器名称,两个用于操作名称。我不喜欢我在应用程序中对这两个动作进行硬编码。拥有友好的默认值会很好。我希望能够全局指定默认错误操作。

所以,有几个问题:

  • 如何全局配置我的属性可以引用的路由?
  • 当我需要覆盖默认值时,引用控制器/操作对的最佳方法是什么?

属性的一个问题是属性的所有参数都必须是常量。所以我无法计算ActionResult或类似的东西。

1 个答案:

答案 0 :(得分:1)

您可以在RouteConfig中定义路径,如下所示:

routes.MapRoute(
                name: "Error",
                url: "error/generalerror",
                defaults: new { controller = "Error", action = "GeneralError" },
                namespaces: new[] { "YourApplication.namespace" }
            );
routes.MapRoute(
                name: "CustomError",
                url: "error/customerror",
                defaults: new { controller = "Error", action = "CustomError" },
                namespaces: new[] { "YourApplication.namespace" }
            );

然后在ActionFilter课程中,您可以拥有默认的两个构造函数

public YourFilterAttribute()
 : this("Error")
{}

public YourFilterAttribute(string route)
{
//store route in some class variable
}

这样大多数课程都会使用这样的属性:[YourFilter]而那些需要自定义路线的课程会使用它:[YourFilter("CustomError")]

这样你的一般路线只在它真正属于的类中被硬编码一次。当然,对于自定义错误路由,您可以创建一些常量字符串来清理更多代码