Asp.net mvc 有没有办法测试基于URL的操作是否存在?
我的登录页面有一个与之关联的重定向url,但该重定向url并不总是有效的,例如,如果用户已注销,然后单击一个按钮发布到一个没有关联GET方法的url,或者如果使用了RedirectToAction 我已经尝试了很多方法,在重定向到那里之前,看看路由是否有效,但没有一种有效 我的返回URL是Asp.net mvc 有没有办法测试基于URL的操作是否存在?,asp.net-mvc,asp.net-mvc-4,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc 4,Asp.net Mvc Routing,我的登录页面有一个与之关联的重定向url,但该重定向url并不总是有效的,例如,如果用户已注销,然后单击一个按钮发布到一个没有关联GET方法的url,或者如果使用了RedirectToAction 我已经尝试了很多方法,在重定向到那里之前,看看路由是否有效,但没有一种有效 我的返回URL是/MyApplicationName/SomeController/SomeAction/12345 我试过: ViewEngineResult viewResult=ViewEngines.Engines.F
/MyApplicationName/SomeController/SomeAction/12345
我试过:
ViewEngineResult viewResult=ViewEngines.Engines.FindView(ControllerContext,returnUrl,null)代码>
BuildManager.GetObjectFactory(returnUrl,false)
还有一些关于RouteData的资料
到目前为止,一切都不起作用
有什么想法吗?您可以尝试以下方法
if (Request.Url != null)
{
var request = new HttpRequest(null, Request.Url.Scheme + "://" + Request.Url.Authority + givenUrl, string.Empty);
var response = new HttpResponse(new StringWriter());
var httpContext = new HttpContext(request, response);
var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
if (routeData != null)
{
var values = routeData.Values;
var controllerName = values["controller"].ToString();
var actionName = values["action"].ToString();
var controllerType =
(from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
where typeof(IController).IsAssignableFrom(t) &&
string.Equals(controllerName + "Controller", t.Name, StringComparison.OrdinalIgnoreCase)
select t).FirstOrDefault();
if (new ReflectedControllerDescriptor(controllerType).GetCanonicalActions()
.Any(x => x.ActionName == actionName))
{
//Action Exists
}
}
}
这里,
为httpcontext创建一个请求和响应,以测试
控制器和动作
routedata与httpcontext一起收集
查找具有反射的控制器类型
从控制器类型中查找操作名称,并测试
routedata中的actionname存在于的action name集合中
控制器
希望这能有所帮助。要做到这一点,需要做很多工作(包括.NET反射)。查看MvcSiteMapProvider
的源代码和。您自己找到解决方案了吗?我还没有解决这个问题,bugtracker中的bug仍然存在!我可能只是手动为所有post设置一些重定向keyvaluepairs,并在重定向之前检查它们。如果我有时间,我将尝试提取控制器和操作,并进行一些反思,以检查控制器,看看它是否有一个有效的URL方法,如果我可以读取属性。我们拭目以待。如果我用这种方式解决它,我会在下面发布一个答案。看起来不错,我只需要找出如何过滤它以只获取操作,因为发布操作不会与重定向一起工作。你的代码工作得很好!为了完成它,我循环执行所有操作,而不是使用.Any
(因为可能有同名的GET和POST),然后将操作描述符
转换为具有MethodInfo
属性的ReflectedActionDescriptor
。然后我可以执行reflectedAction.GetCustomAttributes(typeof(ActionMethodSelectorAttribute),true.Cast().ToList()代码>将为我提供所有属性。如果有任何属于“HttpPostAttribute”类型的属性,则它是一个POST,否则它是一个GET。