Asp.net mvc 有没有办法测试基于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

我的登录页面有一个与之关联的重定向url,但该重定向url并不总是有效的,例如,如果用户已注销,然后单击一个按钮发布到一个没有关联GET方法的url,或者如果使用了RedirectToAction

我已经尝试了很多方法,在重定向到那里之前,看看路由是否有效,但没有一种有效

我的返回URL是
/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。