从View访问RouteData.Values的最简单方法

时间:2011-05-19 20:22:03

标签: asp.net-mvc-3 razor

我使用以下代码在我的视图中获取当前的“操作”,因为我想基于它自定义构建actionlink。

ViewContext.RequestContext.RouteData.Values("action")

我的最终目标是使用Javascript构建一些操作链接,而.js需要知道当前控制器和操作是什么,因为我希望它具有灵活性。我通过浏览框架找到了上述内容,但我不知道我是否找到了正确的东西。

var routeData = ViewContext.RequestContext.RouteData;
var linkStub = '/@routeData.Values("controller")/@routeData.Values("action")';

有谁知道这是否是最简单/最直接的方式?

2 个答案:

答案 0 :(得分:27)

最干净的方式是扩展方法

public static class MyUrlHelper
{
    public static string CurrentAction(this UrlHelper urlHelper)
    {
        var routeValueDictionary = urlHelper.RequestContext.RouteData.Values;
        // in case using virtual dirctory 
        var rootUrl = urlHelper.Content("~/");
        return string.Format("{0}{1}/{2}/", rootUrl, routeValueDictionary["controller"], routeValueDictionary["action"]);
    }
}

答案 1 :(得分:13)

你可以从RequestContext获得路线数据,但实际上并不重要(有多种方式)。我不担心经历多个对象(可能只需要几微秒)。您可以通过创建扩展方法(例如url helper)或使有问题的控件继承WebViewPage的自定义实现(您可以在其中创建所需的快捷方式)来使代码更好。像那样:

public abstract class MyWebViewPage<TModel> : WebViewPage<TModel>
{
    public string ControllerName
    {
        get
        {
            return Url.RequestContext.RouteData.Values["controller"].ToString();
        }
    }

    public string ActionName
    {
        get
        {
            return Url.RequestContext.RouteData.Values["action"].ToString();
        }
    }
}