2015-08-20 103 views
1

我的登錄頁面有一個與之關聯的redirectURL,但redirectURL並不總是有效的,例如,如果用戶註銷,然後單擊一個按鈕將POST POST到沒有關聯GET方法的URL,或者RedirectToAction是用過的。任何基於URL測試動作是否存在的方法?

我已經嘗試了很多方法來查看在重定向之前路由是否有效,但沒有任何工作。

我RETURNURL是/MyApplicationName/SomeController/SomeAction/12345

我曾嘗試:

ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, returnUrl, null);

BuildManager.GetObjectFactory(returnUrl, false)

,有些東西我找到的所以關於的RouteData。

到目前爲止沒有任何工作。

任何想法?

+0

有相當多的涉及(包括.NET反射)來做到這一點。看看[MvcRouteTester]的源代碼(https://github.com/AnthonySteele/MvcRouteTester)和[AuthorizeAttributeAclModule](https://github.com/maartenba/MvcSiteMapProvider/blob/master/src/MvcSiteMapProvider/ 「MvcSiteMapProvider」的MvcSiteMapProvider/Security/AuthorizeAttributeAclModule.cs#L85)。 – NightOwl888

+0

您是否自己找到解決方案? – MstfAsan

+0

我還沒有解決這個問題,bug仍然在bugtracker中!我可能只是手動編寫一些重定向的keyvaluepairs的所有職位,並檢查他們之前,我重定向。如果我有時間,我會嘗試提取控制器和操作,並進行一些反射來檢查控制器,並查看它是否具有URL的有效方法,如果我可以讀取這些屬性的話。我們拭目以待。如果我以這種方式解決問題,我會在下面發表一個答案。 – NibblyPig

回答

1

你可以嘗試以下方法,

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. routedata通過httpcontext收集。

  3. 找到帶反射的控制器類型。

  4. 從控制器類型中查找操作名稱,並測試控制器的操作名稱集合中是否存在路由數據中的 操作名稱。

希望這會有所幫助。

+0

這看起來不錯,我只需要弄清楚如何將它過濾爲GET操作,因爲POST操作不會與重定向一起工作 – NibblyPig

+1

您的代碼很好用!爲了完成它,我循環所有操作,而不是使用'.Any'(因爲可能有一個GET和POST同名),然後我將'ActionDescriptor'轉換爲'ReflectedActionDescriptor',它有一個'MethodInfo'屬性。然後我可以做'reflectAction.GetCustomAttributes(typeof(ActionMethodSelectorAttribute),true).Cast ()。ToList();'這會給我所有的屬性。如果有任何類型爲'HttpPostAttribute'的屬性,那麼它是一個POST,否則它是一個GET。 – NibblyPig

+0

我正要提出這個建議。很高興它解決了。 – shakib

相關問題