问题标签 [custom-action-filter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2993 浏览

asp.net-mvc - 如果会话在 mvc 中过期,则显示来自 ActionFilter 的弹出窗口

我们使用 mvc 创建了一个网站,其中我有 3 个控制器:

我们在 ActionFilters 中编写了自定义授权,我们在其中检查会话是否已过期。如果会话过期,我们将重定向到登录页面。这是 ActionFilter 中的代码:

这非常有效,即当会话到期并且用户单击网站上的任何链接时,他将被重定向到登录页面,其地址为

但是现在我们想在页面(无论用户在哪个页面)上显示一个弹出窗口,它将显示消息“该会话已过期”,并且在关闭该弹出窗口时,用户将被重定向到登录页面。

我无法弄清楚如何从 ActionFilter 本身调用 Jquery 弹出窗口。我在网上搜索了许多解决方案,但找不到正确的解决方案。有人建议使用HandleUnauthorizedRequest来调用 Action 方法(Call RedirectToAction from ActionFilter)。但是,我很困惑是只使用HandleUnauthorizedRequest还是在我的代码中同时使用 this 和OnAuthorization 。有人可以提出解决方案吗?

注意:我有一个通用视图,我可以在其中保留 html 以供在整个网站上使用。

0 投票
2 回答
1782 浏览

c# - MVC ActionFilter:重写请求/重定向到动作

想象一个绑定了许多域的站点。fe product1.com, product2.com, ...

当product23 出现故障时,想法是让“landingpagecontroller”为product23.com 提供所有请求。

这个想法是写一个 ActionFilter 来完成这个:

NeedsLandingpage() 返回一个布尔值。如果需要登陆页面控制器服务,则为真。情报将在数据库中找到。

我已经添加了到登录页面控制器的路由。

关于如何从 actionfilter 更改路由设置以触发上述路由或实现目标的更好解决方案的任何提示。

********** 更新 ************

鉴于大家的意见,我想出了以下可行的解决方案,但我对它并不是 100% 满意。因此,欢迎提供更好的解决方案。

我创建了以下 IActionFilter 并将其注册为全局。

我不喜欢该解决方案的是检查 (String)filterContext.RouteData.Values["controller"]

这是需要的,否则您会陷入循环,因为。

浏览器 -> 路由 -> 过滤器 -> 重定向 -> 路由 -> 过滤器...

我认为一个可能的解决方案是在 Application_BeginRequest (global.asax) 中做一些事情。但我没有找到“重写”请求的方法。因为如果这可能,流程将是:浏览器 -> BeginRequest -> RewriteRequest -> 路由 -> 控制器。

我猜,如果您遵循最佳实践,那么在 vNext 中,下站点似乎将不再起作用。

过滤器配置文件

所有“登陆页面”调用都被重定向到 LandingPageController。对 ViewEngine 的调用用于检查从 actionfilter 传递的视图名称是否存在,如果不使用默认值。

视图示例。

为了给它一个不同于普通页面的“特殊”布局(没有菜单),我为此页面添加了一个自定义布局。

0 投票
1 回答
451 浏览

nhibernate - 自定义操作过滤器统一依赖注入 web api 2

我关注了这篇文章,除了依赖注入(部分)之外,一切都正常了。在我的项目中,我正在使用统一,我正在尝试创建一个自定义事务属性,其目的是在执行操作之前启动 NHibernate 事务并在方法执行之后提交/回滚事务。

这是我的属性的定义:-

以下是我的 TransactionFilter 的定义

我创建了一个自定义过滤器提供程序,它使用统一来构建这个过滤器。

我在UnityWebApiActivator中注册了UnityActionFilterProvider(我使用的是Unity.AspNet.WebApi包)如下

问题是对于任何操作的第一个请求一切正常,但对同一操作的后续请求不会重新创建 TransactionFilter,这意味着它不会调用构造函数来分配新的 UOW。我不认为我可以禁用动作过滤器缓存。

我现在唯一的选择是使用服务定位器模式并使用 ExecuteActionFilterAsync 中的容器获取 UOW 实例,我认为这会扼杀这个目的,我最好实现自定义 ActionFilterAttribute。

有什么建议么 ?

0 投票
1 回答
30 浏览

asp.net-mvc-3 - 在尝试使用直接 URL 浏览时检查用户是否经过身份验证

提前致谢。当用户尝试直接在浏览器中访问 URL 时,我想根据他们对我的应用程序的授权来​​限制用户。无论用户是否有权访问特定服务,我们都从数据库表中获取标志。我们有 n 个控制器,所以我不能使用会话变量。您能否建议我如何使用这些标志通过自定义操作过滤器来限制用户。

0 投票
2 回答
2303 浏览

asp.net - 从 ActionFilterAttribute 中的 URL 获取操作名称

我正在编写从ActionFilterAttribute类中继承的自定义过滤器属性ASP.Net MVC。我想从 url 获取动作名称,我试过了

但是 中没有项目controllerContext.RouteData.Values,因此给了我空引用错误。有没有其他方法可以达到同样的效果?

0 投票
1 回答
678 浏览

asp.net-mvc - BindModel 在 ActionFilterAttribute 之前执行

我开始遇到一个奇怪的问题。

我有一个 ASP.NET 项目,其中有一个接受 POST 参数的 API。由于我使用接口,因此我使用自定义反序列化器来读取 POST 对象。它工作正常,直到最后几天。但是,有一天我开始收到 500 - 内部服务器错误,说“无法创建接口的实例......通过 CreateModel”。当时,我正在使用 PostMan 应用程序。由于代码几乎没有变化,我认为可能是 PostMan 应用程序损坏了。

我不确定,所以我在 Fiddler 上尝试了相同的查询,它运行良好。现在,3-4 天后,Fiddler 也停止工作,出现同样的错误。

深入研究后,我发现“BindModel”以某种方式开始执行可能在 ActionFilterAttribute 之前。我只是不确定这怎么可能。有什么办法可以克服这种情况吗?我发布的 http 调用只是没有进入 JsonFilter 的 OnActionExecuting 方法

错误信息:

[MissingMethodException:无法创建接口的实例。]
System.RuntimeTypeHandle.CreateInstance(...)
System.RuntimeType.CreateInstanceSlow(...)
System.Activator.CreateInstance(...)
System.Activator.CreateInstance(.. .)
System.Web.Mvc.DefaultModelBinder.CreateModel(...)

[MissingMethodException:无法创建接口的实例。对象类型'MyCommonObj.IMyInterface'。]
System.Web.Mvc.DefaultModelBinder.CreateModel(...)
System.Web.Mvc.DefaultModelBinder.BindComplexModel(...)
System.Web.Mvc.DefaultModelBinder.BindModel(... )

代码片段:

0 投票
1 回答
377 浏览

c# - C# Action Filter 将多个 resx 文件序列化为 JSON

总的来说,我是 Action Filters 的新手,一直想知道它是如何工作的。这似乎是一个学习的好机会......

我们正在替换 Castle Monorail 应用程序的 UI,我想保留或实现类似于它作为自定义操作过滤器提供的 [Resource] 属性的功能,该过滤器将字符串写入视图包,以便我们可以编写将它们转换为全局范围内的 JSON 对象,并在 JavaScript 中使用它们。

目前,我们像这样装饰控制器类(当然我会装饰控制器方法):

我的问题是:“我如何编写一个动作过滤器,从个人使用中构建资源列表并将它们存放到模型或视图包变量中?” ......或者可能......“我如何编写一个可以多次调用的操作过滤器而不覆盖以前调用的数据?”

我已经阅读了我能找到的教程和文章,但是我发现的任何关于在单个控制器方法上多次调用动作过滤器的信息几乎肯定是关于控制执行顺序而不是它的实际实现方式。

我欢迎任何代码/伪代码为我揭开这个神秘面纱。

提前致谢

0 投票
1 回答
729 浏览

asp.net-mvc-5 - 覆盖 Application_PreRequestHandlerExecute

如果会话已过期,我继承了一个使用 Application_PreRequestHandlerExecute 重定向到登录的应用程序。

目前有一个不应调用重定向的硬编码 url 列表。本质上,这些是返回 json 的 ajax 方法,因此它们在 javascript 中单独处理。

我想更改机制,以便默认值(在 Application_PreRequestHandlerExecute 中)保持不变,但替代行为可以由 ActionFilters 在适当的操作(即对应于硬编码的 url 列表的操作)上控制。

如何检查 Application_PreRequestHandlerExecute 中是否存在特定的 ActionFilter?

编辑:也许我需要用全局操作过滤器替换 Application_PreRequestHandlerExecute?

0 投票
1 回答
3293 浏览

asp.net-mvc - 不允许子操作执行重定向操作 - MVC

我有一个 _layout 加载菜单:

在 Action MenuRole 中,我使用 Action Filter 检查会话:

并在动作过滤器中:

会话超时时,_layout 在@Html.Action("MenuRole","Menu") 中显示错误:不允许子操作执行重定向操作

0 投票
1 回答
22813 浏览

c# - 如何将参数添加到 asp.net 中的操作过滤器?

我有以下过滤器属性,我可以像这样将字符串数组传递给属性[MyAttribute("string1", "string2")]

如何将字符串数组传递_ids给动作过滤器的实现?我错过了一些非常明显的东西!?