短版本:
我有一个扩展方法,扩展了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调用它时,我得到了例外。为什么我会得到这个例外?
答案 0 :(得分:2)
好的解决了这个问题。如果有人需要这样做:问题不在于扩展方法,而在于我调用它的方式。我使用默认构造函数实例化了一个新的UrlHelper
,但我需要使用带有requestContext
的构造函数。
因此,如果您想在控制器中使用它,请使用:
构造UrlHelper
var url = new UrlHelper(Request.RequestContext);
并且在一个单独的课程中:
var url = new UrlHelper(HttpContext.Current.Request.RequestContext);