gpt4 book ai didi

c# - ActionFilterAttribute 范围调用顺序

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:57 25 4
gpt4 key购买 nike

我的 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;

我以这种方式在我的 Controller 中使用它:

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

不,我遇到的问题是 ASP MVC 按顺序调用过滤器 Action-Scope -> Method-Scope。但我希望 Method-Scope 过滤器是结果并覆盖 Controller-Scope 过滤器。

我的问题:

  1. 在 MSDN 中写道,过滤器按“AttributeTargets”枚举(类 = 4,方法 = 0x40)的枚举值顺序调用。为什么最后调用 Controller-Scope 过滤器?
  2. 如何在不使用“Order”属性的情况下解决我的订单问题? 是否是检测 samt 类型的 Methode-Scope 过滤器是否存在的正确方法?

提示

.ControllerDescriptor.IsDefined(...

对我没有帮助,因为如果 MasterName 是否由过滤器设置,我的实际实现有一些条件。因此,找到 Method-Scope Attribute 并不能告诉我是否使用了过滤器,以及是否应该使用 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”是事件的。

问候史蒂芬!

最佳答案

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

If you want to set one or different Master-page for each view on run time or on design time. you can use _ViewStart.cshtml.


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

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

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

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

关于c# - ActionFilterAttribute 范围调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30298267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com