当我在类中使用帮助程序时,如何将对象作为RouteValueDictionary传递给Url.Action?

时间:2015-10-01 10:18:45

标签: c# asp.net-mvc-5

短版本: 我有一个扩展方法,扩展了MVC 5的UrlHelper辅助方法。我想将(字符串操作,字符串控制器,对象routeValues)传入此方法,并在其中使用Url.Action(" action"," controller",routeValues)。当我这样做时,ArgumentNullException获得了routeCollection。这样做的正确方法是什么,所以我没有得到这个例外?

长版 我有以下扩展方法:

public static string ActionToUrl(this UrlHelper url, string action, string controller, object routeValues)
    {
        Uri contextUri = HttpContext.Current.Request.Url;

        var relativeContentPath = url.Action(action, controller, routeValues);

        var baseUri = string.Format("{0}://{1}{2}", contextUri.Scheme,
           contextUri.Host, contextUri.Port == 80 ? string.Empty : ":" + contextUri.Port);

        return string.Format("{0}{1}", baseUri, VirtualPathUtility.ToAbsolute(relativeContentPath));
    }

这个想法是,这个方法在使用时会返回一个绝对的url路径,而不是Url.Action返回的相对路径。

但是,当我在Url.Action内部使用RouteValueDictionary重载时,我收到了ArgumentNullException:

  

值不能为空。参数名称:routeCollection

如果我使用简单(动作,控制器)重载,我不会得到此异常。

我还尝试使用RouteValueDictionary构造函数构建RouteValueDictionary(object routeValues),然后将其发送到Url.Action,如:

var routeValueDictionary = new RouteValueDictionary();

var relativeContentPath = url.Action(action, controller, routeValueDictionary);

但是我收到同样的错误,所以我知道问题不是从object转换为RouteValueDictionary

我在这里错过了什么?

编辑:

当我在视图中使用它时,扩展名实际上正在工作。当我从服务类中的新UrlHelper调用它时,我得到了例外。为什么我会得到这个例外?

1 个答案:

答案 0 :(得分:2)

好的解决了这个问题。如果有人需要这样做:问题不在于扩展方法,而在于我调用它的方式。我使用默认构造函数实例化了一个新的UrlHelper,但我需要使用带有requestContext的构造函数。

因此,如果您想在控制器中使用它,请使用:

构造UrlHelper

var url = new UrlHelper(Request.RequestContext);

并且在一个单独的课程中:

var url = new UrlHelper(HttpContext.Current.Request.RequestContext);