如何在视图或控制器中获取当前区域名称?
ViewContext.RouteData.Values["controller"]区域有什么吗?
我正在测试ASP MVC路由.我在ASP MVC 5.1中遇到属性路由问题
当我有这样的控制器时:
public class FooController : Controller
{
[Route("foo")]
[HttpGet]
public ActionResult Get()
{
....
}
[Route("foo")]
[HttpPost]
public ActionResult Post()
{
....
}
}
Run Code Online (Sandbox Code Playgroud)
然后为了测试哪个路由匹配特定请求,我打电话routes.GetRouteData.我得到一个System.Web.Routing.RouteData包含路由以及应该说明哪个控制器和操作匹配的值.
问题是这个路由现在是RouteCollectionRoute的一个实例,
这个内部类是这两个动作的一组路由的包装器.控制器在RouteData.values,但行动不是.你可以得到这些包含的路线routeData.Values["MS_DirectRouteMatches"] as IList<RouteData>.
在给出的示例中,列表中将有两个路径,用于两个操作方法.我需要知道哪些包含的路由实际匹配,以便我可以读取匹配路由的操作方法名称.我该如何解决这条路线?
我有点不知所措的设计选择RouteCollectionRoute.路由时,您有一个路由集合,然后通过调用解析URL的路由GetRouteData.现在你有一条路线.但如果它是一个RouteCollectionRoute如此仍然是路线的集合和路线解决尚未结束.有一个RouteCollectionRoute获得了什么?路线解决现在是一个两步过程吗?还是一个递归过程?
我知道我正在浏览ASP MVC的内部,但这是唯一的方法,因为它真的没有考虑到这种可测试性.即使是暴露一些内部类或方法等简单的事情也会有很大帮助!
asp.net-mvc asp.net-mvc-routing attributerouting asp.net-mvc-5.1
所以我创建了自己的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);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以调用的操作很好,但无法访问我的控制器工厂中的操作名称:
[Route("Open/{createModel:bool?}/{tlpId:int}/{siteId:int?}")]
public ActionResult Open(int tlpId, int? siteId, bool? createModel = true)
{
}
Run Code Online (Sandbox Code Playgroud)
欢迎任何想法.
更新:
问题似乎与属性路由有关.虽然它在repro中运行良好但它对我来说不适用于生产.
途中发现这一点-一旦 …