我如何传递一个对象给Url.当我在类中使用helper时,Action作为RouteValueDictionary

本文关键字:helper RouteValueDictionary 作为 Action 一个对象 何传递 Url | 更新日期: 2023-09-27 18:15:23

简体版:我有一个扩展方法,扩展MVC 5的UrlHelper helper方法。我想传入(字符串动作,字符串控制器,对象routeValues)到这个方法,并使用Url。Action(" Action ", "controller", routeValues)。当我这样做时,我得到routeCollectionArgumentNullException。正确的做法是什么,这样我就不会得到这个异常?

长版

我有以下扩展方法:

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过载:

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

如果我使用简单的(action, controller) overload,我不会得到这个异常。

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

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

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

我在这里错过了什么?

编辑:

扩展实际上是工作时,我在一个视图中使用它。当我从服务类中的新UrlHelper调用这个时,我得到了异常。为什么会出现这个异常?

我如何传递一个对象给Url.当我在类中使用helper时,Action作为RouteValueDictionary

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

如果你想在控制器中使用这个,用:

构造UrlHelper

var url = new UrlHelper(Request.RequestContext);

和在一个单独的类中:

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