有什么方法可以根据 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
        }

    }
}

这里,

  1. 为 httpcontext 创建请求和响应以测试 控制器和动作。

  2. 路由数据与 httpcontext 一起收集。

  3. 通过反射找到控制器类型

  4. 从控制器类型中找到动作名称并测试是否 routedata 中的 actionname 存在于来自的操作名称集合中 控制器。

希望这对您有所帮助。