繁体   English   中英

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

[英]How can I pass an object to Url.Action as a RouteValueDictionary when I use the helper in a class?

简短版:我有一个扩展方法,用于扩展MVC 5的UrlHelper帮助器方法。 我想将(字符串操作,字符串控制器,对象routeValues)传递给此方法,并在其中使用Url.Action(“ action”,“ controller”,routeValues)。 当我这样做时,会为routeCollection获取ArgumentNullException 做到这一点的正确方法是什么?

长版我有以下扩展方法:

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返回的相对路径。

但是,我得到一个ArgumentNullException,当我尝试使用Url.Action这里面与RouteValueDictionary过载:

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

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

我也尝试构建RouteValueDictionaryRouteValueDictionary(object routeValues)构造函数,然后将它发送到Url.Action ,如:

var routeValueDictionary = new RouteValueDictionary();

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

但是我遇到了同样的错误,所以我知道问题不在于从objectRouteValueDictionary的转换。

我在这里想念什么?

编辑:

当我在视图中使用扩展程序时,该扩展程序实际上正在工作。 当我从服务类中的新UrlHelper调用此函数时,出现异常。 为什么会出现此异常?

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

因此,如果要在控制器中使用它,请使用以下命令构造UrlHelper

var url = new UrlHelper(Request.RequestContext);

并在一个单独的类中:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM