【问题标题】:How can I pass an object to Url.Action as a RouteValueDictionary when I use the helper in a class?当我在类中使用帮助器时,如何将对象作为 RouteValueDictionary 传递给 Url.Action?
【发布时间】:2015-12-29 08:37:45
【问题描述】:

短版: 我有一个扩展 MVC 5 的 UrlHelper 辅助方法的扩展方法。我想将 (string action, string controller, object routeValues) 传递给这个方法,并在其中使用 Url.Action("action", "controller", routeValues)。当我这样做时,我得到一个ArgumentNullExceptionrouteCollection。这样做的正确方法是什么,所以我没有得到这个异常?

加长版 我有以下扩展方法:

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.ActionRouteValueDictionary 重载时,我得到了 ArgumentNullException:

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

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

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

var routeValueDictionary = new RouteValueDictionary();

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

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

我在这里错过了什么?

编辑:

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

【问题讨论】:

  • 如果您只是想获得一个绝对 URL,您已经可以使用 Url.Action 方法实现这一点 - 只需指定方案即可。
  • 你的意思是Request.Url.Scheme?你能考虑这样的端口吗?
  • 是的,就是这样。 Url.Action 方法将只是当前主机是什么,包括端口。
  • 谢谢,这很有用;但是当我在控制器中执行此操作时,我遇到了同样的异常:var x = Action("action", "controller", new { id = "deneme" }, ControllerContext.HttpContext.Request.Url.Scheme。同样的 ArgumentNullException 是:Value cannot be null. Parameter name: routeCollection 我真的迷路了,为什么会出现这个异常?
  • 天哪,我的扩展程序实际上正在工作,我得到了异常,因为我是从控制器调用它的。不过,我仍然不明白为什么会出现异常。

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


【解决方案1】:

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

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

var url = new UrlHelper(Request.RequestContext);

在一个单独的班级中:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 2012-03-30
    • 1970-01-01
    相关资源
    最近更新 更多