- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我创建了自己的 ControllerFactory 并重载了 GetControllerSessionBehavior 以扩展 MVC 行为。
为了完成我的自定义工作,我必须对调用的操作使用反射。但是我偶然发现了一个奇怪的问题 - 我无法通过访问 RequestContext.RouteData 检索操作
在为此设置复制示例时,我无法重现错误。
是否有人知道造成这种情况的可能原因,或者知道如何通过使用除此以外的请求上下文调用方法来检索操作?
public class CustomControllerFactory : DefaultControllerFactory
{
protected override SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, Type controllerType)
{
if (!requestContext.RouteData.Values.ContainsKey("action"))
return base.GetControllerSessionBehavior(requestContext, controllerType);
var controllerAction = requestContext.RouteData.Values["action"];
var action = controllerAction.ToString();
var actionMethod = controllerType.GetMember(action, MemberTypes.Method, BindingFlags.Instance | BindingFlags.Public).FirstOrDefault();
if(actionMethod == null)
return base.GetControllerSessionBehavior(requestContext, controllerType);
var cattr = actionMethod.GetCustomAttribute<SessionStateActionAttribute>();
if (cattr != null)
return cattr.Behavior;
return base.GetControllerSessionBehavior(requestContext, controllerType);
}
}
我可以很好地调用但无法访问我的 Controller 工厂中的操作名称的操作:
[Route("Open/{createModel:bool?}/{tlpId:int}/{siteId:int?}")]
public ActionResult Open(int tlpId, int? siteId, bool? createModel = true)
{
}
欢迎任何想法。
更新:
问题似乎与属性路由有关。虽然它在复制中工作正常,但对我来说在生产中不起作用。
一路上找到这个 - 一次 this我想我也会有合适的解决方案。
更新 2:
很有趣。复制 MVC 版本 5.0.0.0,生产 5.2.2。可能引入错误?
最佳答案
我可以确认 5.0.0 和 5.1.1 之间的属性路由发生了重大变化。我报告了这个问题here .但是,对于我的用例,Microsoft 能够提供可接受的解决方法。
另一方面,您遇到的问题看起来像是另一个罪魁祸首。对于属性路由,路由值存储在名为 MS_DirectRouteMatches
的嵌套路由键中。我不确定具体是哪个版本发生了变化,但我知道它发生在 v5+。
因此,要解决您的问题,您需要检查是否存在嵌套的 RouteData 集合,并在存在的情况下使用而不是普通的 RouteData。
var routeData = requestContext.RouteData;
if (routeData.Values.ContainsKey("MS_DirectRouteMatches"))
{
routeData = ((IEnumerable<RouteData>)routeData.Values["MS_DirectRouteMatches"]).First();
}
var controllerAction = routeData.Values["action"];
var action = controllerAction.ToString();
顺便说一句 - 在 linked question 中在您提供的情况下,提问者假设请求有可能匹配多个路由。但这是不可能的 - 一个请求将匹配 0 或 1 个路由,但绝不会超过一个。
关于asp.net-mvc - RequestContext - RouteData 不包含操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29080707/
使用 ASP.Net 路由时,如何从代码隐藏中获取 RouteData? 我知道您可以从 RouteHandler 的 GetHttpHander 方法获取它(您将获得 RequestContext)
我试图在我的组件中接收 RouteData,但它没有像我预期的那样工作。我收到的消息是:ORIGINAL EXCEPTION: Invalid argument(s): No provider fou
令我惊讶的是,竟然没有文章详细回答这个问题。我有几个与 RouteData.Values[""] 相关的问题。 我看到了这段代码: public ActionResult Index() {
我的路线代码如下所示: RouteTable.Routes.MapPageRoute("IDP", "Person/{IDP}", "~/Person.aspx") 现在我想获取表单上的数据,通常它
给出以下代码: public class MyActionFilter : ActionFilterAttribute { public override void OnActionExecu
我通过 NuGet 将 Microsoft.Asp.Net.FriendlyUrls.Core.dll 安装到现有的 asp.net 4.5 Webforms 网站。 我的 RouteConfig 文
我正在开发一个 .net 核心应用程序。我正在尝试访问中间件中的路由数据,但它始终返回 null。 这是 Controller 基本路线 [Route("User/{UserId}/Quote")]
我正在自定义 Action Filter 中设置一些 RouteData filterContext.RouteData.Values.Add("accountId", accountId); fil
如果在使用 URL 路由时查询字符串中不存在以下语句,我将收到以下语句的 null 异常错误,我该如何处理以下语句的 NullReferenceException string lang = Rout
我正在尝试以编程方式将查询字符串映射到我在 RouteConfig.cs 文件中创建的 SEO 友好路由 URL,但似乎遇到困难。 我的路由配置如下所示: routes.MapRoute( n
我正在尝试更改我所有 Controller 的默认 ViewBag.Title,因此我想创建一个继承自 Controller 并在那里处理标题的基类: public class MyControlle
我正在构建一个连接到 Application_EndRequest/Application_BeginRequest 的简单性能记录器 我想将 action 和 controller 的名称作为某种
所以我创建了自己的 ControllerFactory 并重载了 GetControllerSessionBehavior 以扩展 MVC 行为。 为了完成我的自定义工作,我必须对调用的操作使用反射。
运行时出现错误 string quote = Page.RouteData.Values["quote"].ToString() ?? string.Empty; 错误:对象引用未设置到对象的实例。
当我尝试使用 TypeScript 在 Angular2 Beta 中使用 RouteData 时遇到问题。 我将它注入(inject)构造函数并正确导入 import {RouteConfig, R
我创建了一个新的 Web 窗体 (ASP.NET 4.5) 项目,我正在尝试让 URL 路由正常工作。 RouteConfig.cs 看起来像这样: routes.MapPageRoute("surv
我想使用 RouteConfig 将一个变量从我的 AppComponent 传递到 Coursescomponent,但是路由配置中的“data”属性只能传递常量参数,它无法识别“this”。有办法
如果我有这样的操作: public ActionResult DoStuff(List stuff) { ... ViewData["stuff"] = stuff; ...
我有使用 Microsoft.AspNet.FriendlyUrls 在 ASP.NET c# WebForms 中工作的路由,但 不是 对于所有页面。 下面是一个例子: routes.MapPage
我的 Global.asax 中有一条规则,如下所示: RouteTable.Routes.MapPageRoute("defaultRoute", "{*value}", "~/default.as
我是一名优秀的程序员,十分优秀!