[英]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
如果我使用简单的(动作,控制器)重载,则不会得到此异常。
我也尝试构建RouteValueDictionary
其RouteValueDictionary(object routeValues)
构造函数,然后将它发送到Url.Action
,如:
var routeValueDictionary = new RouteValueDictionary();
var relativeContentPath = url.Action(action, controller, routeValueDictionary);
但是我遇到了同样的错误,所以我知道问题不在于从object
到RouteValueDictionary
的转换。
我在这里想念什么?
编辑:
当我在视图中使用扩展程序时,该扩展程序实际上正在工作。 当我从服务类中的新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.