【问题标题】:Url.Action with RouteValueDictionary with ProtocolUrl.Action 与 RouteValueDictionary 与协议
【发布时间】:2013-03-15 22:13:17
【问题描述】:

看了一段时间,觉得自己很愚蠢,想多看几眼..

我需要生成一个完整的URL,(例如http://www.domain.com/controller/action?a=1&b=2),通常我只是使用Url.Action通过指定协议来做到这一点没有问题:

var url = Url.Action("Action", "Controller", new { a = 1, b = 2 }, "http");

我已经开始组合一个返回RouteValueDictionary 的类,以使这些匿名对象消失。但是,我无法让它与助手一起工作。

var x = Url.Action("Action", "Controller", new RouteValueDictionary(new { a = 1, b = 2 }), "http");
// "http://127.0.0.1/Controller/Action?Count=2&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D",

var y = Url.Action("Action", "Controller", new { a = 1, b = 2 }, "http");
// "http://127.0.0.1/Controller/Action?a=1&b=2"

非常感谢任何导致 facepalm 的指针:)

更新:

最好澄清一下,在上面的示例中,我需要让“X”变量正常工作,因为 RouteValueDictionary 是在代码的其他位置创建的。假设 RouteValueDictionary 是正确的。

我只是不明白为什么这适用于匿名对象,但是包裹在同一对象中的同一对象包裹在 RouteValueDictionary 中让助手吓坏了。

【问题讨论】:

  • 您实际上是如何创建 RouteValueDictionary 的?

标签: asp.net-mvc


【解决方案1】:

有趣的是,您的具体示例似乎匹配将“对象”作为属性而不是 RouteValueDictionary 的方法签名。因此,它只是 ToString() 输出类型名,而不是正确序列化 RouteValueDictionary

 var x = Url.Action("Index", "Home", new RouteValueDictionary(new { a = 1, b = 2 }), "http", string.Empty);

注意最后的“string.Empty”

这足以强制代码使用不同的重载,它接受 RouteValueDictionary 并因此正确序列化。

// http://localhost:55110/?a=1&b=2

【讨论】:

  • 他使用的重载需要对象,而大多数其他重载需要 RouteValueDictionary,请参阅我的回答。
  • 有趣的是,您还可以添加一个 string.Empty 作为主机参数来获取您要查找的输出。
  • 好吧,这真的让我很困惑,string.Empty 有效,并且比每次都必须点击RequestContext 好。
  • 我只是看不出为什么我的原始代码会导致助手发疯。
  • 删除了一个拉取请求以在 vNext 队列中添加缺少的重载:aspnetwebstack.codeplex.com/SourceControl/network/forks/…
【解决方案2】:

您使用的重载需要类型“object”作为您传递RouteValueDictionary 的参数。出于某种原因,这导致了问题,可能与 .ToString() 有关?使用接受RouteValueDictionary 的重载,这应该可以工作。

要对此进行测试,请添加一个 hostName 参数以选择如下所示的重载:

编辑

您可以在您的项目中使用此扩展来将所需的重载添加到 Url.Action。在内部,它将解析并从请求中添加主机名。

public static string Action
    (this UrlHelper helper, string action, 
     string controller, RouteValueDictionary routeValues, string protocol)
{
     string hostName = helper.RequestContext.HttpContext.Request.Url.Host;
     return helper.Action(action, controller, routeValues, protocol, hostName);
}

【讨论】:

  • 谢谢,但不幸的是这对我没有帮助 - 因为匿名对象的创建仍然是内联的 - 这已被移到其他地方以删除重复。我需要知道为什么问题中的“X”变量是错误的..
  • 匿名对象创建在您的 x 示例中是内联的?您是否省略了您正在使用的方法调用?
  • 我已经更新以澄清 - 'X' 变量正在使用 RouteValueDictionary - 假设它是在代码的其他地方创建的。只是做一个简单的复制案例。
  • 我需要协议参数来强制帮助程序生成完整的 URL。否则,您只需获取路径(URL 将进入电子邮件,因此我们需要整个内容)。
  • 很高兴!很遗憾它一开始就没有在框架中:(
猜你喜欢
  • 2015-07-06
  • 1970-01-01
  • 2016-12-19
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
相关资源
最近更新 更多