【发布时间】:2015-12-29 08:37:45
【问题描述】:
短版:
我有一个扩展 MVC 5 的 UrlHelper 辅助方法的扩展方法。我想将 (string action, string controller, object 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(object routeValues) 构造函数构造RouteValueDictionary,然后将其发送到Url.Action,例如:
var routeValueDictionary = new RouteValueDictionary();
var relativeContentPath = url.Action(action, controller, routeValueDictionary);
但我得到了同样的错误,所以我知道问题不在于从object 到RouteValueDictionary 的转换。
我在这里错过了什么?
编辑:
当我在视图中使用该扩展时,它实际上正在工作。当我从服务类中的新 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