2008-09-30 70 views

回答

14

您可以從ViewContext.RouteData中獲取該數據。下面是如何訪問(和使用)的信息的一些示例:

///這些被添加到我的viewmasterpage,的ViewPage和viewusercontrol基類:

public bool IsController(string controller) 
{ 
    if (ViewContext.RouteData.Values["controller"] != null) 
    { 
     return ViewContext.RouteData.Values["controller"].ToString().Equals(controller, StringComparison.OrdinalIgnoreCase); 
    } 
    return false; 
} 
public bool IsAction(string action) 
{ 
    if (ViewContext.RouteData.Values["action"] != null) 
    { 
     return ViewContext.RouteData.Values["action"].ToString().Equals(action, StringComparison.OrdinalIgnoreCase); 
    } 
    return false; 
} 
public bool IsAction(string action, string controller) 
{ 
    return IsController(controller) && IsAction(action); 
} 

///一些擴展方法我加入了UrlHelper類。

public static class UrlHelperExtensions 
{ 
    /// <summary> 
    /// Determines if the current view equals the specified action 
    /// </summary> 
    /// <typeparam name="TController">The type of the controller.</typeparam> 
    /// <param name="helper">Url Helper</param> 
    /// <param name="action">The action to check.</param> 
    /// <returns> 
    ///  <c>true</c> if the specified action is the current view; otherwise, <c>false</c>. 
    /// </returns> 
    public static bool IsAction<TController>(this UrlHelper helper, LambdaExpression action) where TController : Controller 
    { 
     MethodCallExpression call = action.Body as MethodCallExpression; 
     if (call == null) 
     { 
      throw new ArgumentException("Expression must be a method call", "action"); 
     } 

     return (call.Method.Name.Equals(helper.ViewContext.ViewName, StringComparison.OrdinalIgnoreCase) && 
       typeof(TController) == helper.ViewContext.Controller.GetType()); 
    } 

    /// <summary> 
    /// Determines if the current view equals the specified action 
    /// </summary> 
    /// <param name="helper">Url Helper</param> 
    /// <param name="actionName">Name of the action.</param> 
    /// <returns> 
    ///  <c>true</c> if the specified action is the current view; otherwise, <c>false</c>. 
    /// </returns> 
    public static bool IsAction(this UrlHelper helper, string actionName) 
    { 
     if (String.IsNullOrEmpty(actionName)) 
     { 
      throw new ArgumentException("Please specify the name of the action", "actionName"); 
     } 
     string controllerName = helper.ViewContext.RouteData.GetRequiredString("controller"); 
     return IsAction(helper, actionName, controllerName); 
    } 

    /// <summary> 
    /// Determines if the current view equals the specified action 
    /// </summary> 
    /// <param name="helper">Url Helper</param> 
    /// <param name="actionName">Name of the action.</param> 
    /// <param name="controllerName">Name of the controller.</param> 
    /// <returns> 
    ///  <c>true</c> if the specified action is the current view; otherwise, <c>false</c>. 
    /// </returns> 
    public static bool IsAction(this UrlHelper helper, string actionName, string controllerName) 
    { 
     if (String.IsNullOrEmpty(actionName)) 
     { 
      throw new ArgumentException("Please specify the name of the action", "actionName"); 
     } 
     if (String.IsNullOrEmpty(controllerName)) 
     { 
      throw new ArgumentException("Please specify the name of the controller", "controllerName"); 
     } 

     if (!controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) 
     { 
      controllerName = controllerName + "Controller"; 
     } 

     bool isOnView = helper.ViewContext.ViewName.SafeEquals(actionName, StringComparison.OrdinalIgnoreCase); 
     return isOnView && helper.ViewContext.Controller.GetType().Name.Equals(controllerName, StringComparison.OrdinalIgnoreCase); 
    } 

    /// <summary> 
    /// Determines if the current request is on the specified controller 
    /// </summary> 
    /// <param name="helper">The helper.</param> 
    /// <param name="controllerName">Name of the controller.</param> 
    /// <returns> 
    ///  <c>true</c> if the current view is on the specified controller; otherwise, <c>false</c>. 
    /// </returns> 
    public static bool IsController(this UrlHelper helper, string controllerName) 
    { 
     if (String.IsNullOrEmpty(controllerName)) 
     { 
      throw new ArgumentException("Please specify the name of the controller", "controllerName"); 
     } 

     if (!controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) 
     { 
      controllerName = controllerName + "Controller"; 
     } 

     return helper.ViewContext.Controller.GetType().Name.Equals(controllerName, StringComparison.OrdinalIgnoreCase); 
    } 

    /// <summary> 
    /// Determines if the current request is on the specified controller 
    /// </summary> 
    /// <typeparam name="TController">The type of the controller.</typeparam> 
    /// <param name="helper">The helper.</param> 
    /// <returns> 
    ///  <c>true</c> if the current view is on the specified controller; otherwise, <c>false</c>. 
    /// </returns> 
    public static bool IsController<TController>(this UrlHelper helper) where TController : Controller 
    { 
     return (typeof(TController) == helper.ViewContext.Controller.GetType()); 
    } 
} 
+0

警告:此代碼不再在ASP.NET MVC 5 – qJake 2015-03-28 16:42:18

+0

@qJake工作,那麼如何才能MVC5控制器之間的數據共享? – Mrunal 2016-07-06 09:04:08

3

您可以使用<%= Url.Action(動作,控制器,值)%>從母版頁中構建URL。

你這樣做可能會突出顯示當前頁面的標籤或什麼?

如果是這樣,您可以從視圖中使用ViewContext並獲取所需的值。

1

我寫了a helper class,它允許我訪問路由參數。藉助這個幫助程序,您可以獲取傳遞給操作的控制器,操作和所有參數。

18

這爲我工作:

<%= this.Url.RouteUrl(this.ViewContext.RouteData.Values) %>

它返回當前URL這樣; /Home/About

也許有一個更簡單的方法來返回實際的路由字符串?

22

我總是嘗試實施符合項目要求的最簡單的解決方案。正如恩斯坦所說:「讓事情儘可能簡單,但並不簡單。」嘗試這個。

<%: Request.Path %> 
相關問題