ActionFilterAttribute范围调用顺序

时间:2015-05-18 08:21:02

标签: c# asp.net-mvc asp.net-mvc-5 actionfilterattribute

我的ActionFilter的调用顺序有问题。

我创建了一个设置布局MasterName的过滤器:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class MasterNameAttribute : ActionFilterAttribute
{
    public String MasterName { get; set; }

    public MasterNameAttribute(String masterName)
    {
        this.MasterName = masterName;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        viewResult.MasterName = this.MasterName;

我以这种方式在我的控制器中使用它:

[MasterName("_Layout_Main")]
public partial class ProjectController : BaseController
{        
    [MasterName("_Layout_Special")]
    public ActionResult Dashboard()
    {

不,我有ASP MVC按顺序调用过滤器的问题 Action-Scope - >方法-范围即可。但我希望Method-Scope过滤器是结果并覆盖Controller-Scope过滤器。

我的问题:

  1. 在MSDN中写入过滤器以Enum值顺序调用“AttributeTargets”Enum(Class = 4,Method = 0x40)。为什么Controller-Scope过滤器是最后一个名为?
  2. 的过滤器
  3. 如何在不使用“订单”属性的情况下解决订单问题? 检测是否存在samt类型的Methode-Scope过滤器是否是一种正确的方法?
  4. 提示

    .ControllerDescriptor.IsDefined(...
    

    没有帮助我,因为如果MasterName是由过滤器设置的,我的实际实现有一些条件。因此,找到Method-Scope属性并不会告诉我是否使用过滤器以及是否应该使用Controller-Scope过滤器(仅当Method-Scope过滤器未使用时)。所以我认为正确的通话顺序是最好的解决方案。

    与@swapneel回复:

    对不起这不符合我的需求。我有一个非常复杂的布局选择,最好由属性设置。我需要继承,覆盖和订购逻辑。

    像:

    [MasterName("_Layout1", Host = "sub1.domain.com")]
    [MasterName("_Layout2", Host = "sub2.domain.com")]
    [MasterName("_Layout3", Host = "sub3.domain.com")]
    public partial class ProjectController : BaseController
    {
        [MasterName("_Layout_1_1", Host = "sub1.domain.com")]
        [MasterName("_Layout_2_1", Host = "sub2.domain.com")]
        public ActionResult Dashboard()
        {
    

    此处与主机“sub2.domain.com”的“仪表板”操作调用应使用“_Layout2_1”覆盖Controller定义的“_Layout2”MasterName。在所有其他操作中,它不会被覆盖,并且“_Layout2”是活动的。

    关心Steffen!

1 个答案:

答案 0 :(得分:0)

这可能与您的问题无关,但我认为

  

如果要为运行中的每个视图设置一个或不同的母版页   时间或设计时间。你可以使用_ViewStart.cshtml.

_ViewStart.cshtml文件将在每个视图的渲染开始时执行。此文件中代码块中包含的任何代码都将在视图中的任何代码之前执行。通常,此文件将设置应用程序中视图使用的布局模板:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

MVC应用程序可以有多个_ViewStart.cshtml个文件。这些文件的执行顺序取决于文件夹层次结构中文件的位置以及正在呈现的特定视图。 MVC运行时将首先执行位于Views文件夹根目录的_ViewStart.cshtml文件中的代码。然后它将在文件夹层次结构中向上运行,在它找到的每个_ViewStart.cshtml文件中执行代码。例如,如果我们在以下位置有_ViewStart.cshtml个文件:

从此链接复制以上文字 - what-is-the-purpose-of-the-viewstartcshtml-file-and-how-is-it-used