有什么方法可以根据 URL 来测试一个动作是否存在?
Any way to test if an action exists based on a URL?
我的登录页面有一个关联的 redirectURL,但 redirectURL 并不总是有效,例如,如果用户已注销,然后单击按钮 POST 到 url没有关联的 GET 方法,或者如果使用了 RedirectToAction。
我尝试了很多方法来在重定向之前查看路由是否有效,但是 none 奏效了。
我的返回网址是/MyApplicationName/SomeController/SomeAction/12345
我试过:
ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, returnUrl, null);
BuildManager.GetObjectFactory(returnUrl, false)
以及我在 SO 上发现的一些关于 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 创建请求和响应以测试
控制器和动作。
路由数据与 httpcontext 一起收集。
通过反射找到控制器类型
从控制器类型中找到动作名称并测试是否
routedata 中的 actionname 存在于来自的操作名称集合中
控制器。
希望这对您有所帮助。
我的登录页面有一个关联的 redirectURL,但 redirectURL 并不总是有效,例如,如果用户已注销,然后单击按钮 POST 到 url没有关联的 GET 方法,或者如果使用了 RedirectToAction。
我尝试了很多方法来在重定向之前查看路由是否有效,但是 none 奏效了。
我的返回网址是/MyApplicationName/SomeController/SomeAction/12345
我试过:
ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, returnUrl, null);
BuildManager.GetObjectFactory(returnUrl, false)
以及我在 SO 上发现的一些关于 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 创建请求和响应以测试 控制器和动作。
路由数据与 httpcontext 一起收集。
通过反射找到控制器类型
从控制器类型中找到动作名称并测试是否 routedata 中的 actionname 存在于来自的操作名称集合中 控制器。
希望这对您有所帮助。