2013-03-15 72 views
0

我有一个自定义ActionFilterAttribute类向用户发送一个错误的屏幕,链接返回到前一个页面。ASP.NET MVC自定义筛选器属性带控制器/动作名称

该属性接受两个控制器/动作对:一个用于错误画面动作(通常是相同的应用程序范围内),而另一个为返回动作(通常是相同的用于在控制器的所有动作)。这个想法是,当发生错误时,我不希望我的用户感到丢失,因为他们没有回到应用程序的方式。

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

因此,有几个问题:

  • 我怎么能全局配置,我的属性可以参考的路线?
  • 当我需要重写默认值时,引用控制器/操作对的最佳方法是什么?

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

回答

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 
} 

这样,大多数类会使用这样的attibute: [YourFilter]和那些需要一个自定义路线将使用它:[YourFilter("CustomError")]

这样你的一般r oute在它真正属于的类中只进行了一次硬编码。当然,自定义错误的路线,你可以创建一些常量字符串来清洁多的代码