【问题标题】:How do I pass query string parameters with names containing hyphens?如何传递名称包含连字符的查询字符串参数?
【发布时间】:2014-05-12 16:35:07
【问题描述】:

我需要将查询字符串传递给重定向。我知道你可以这样做:

return RedirectToAction("Index", new { param1 = "hello" });

将转到/Index?param1=hello

但我需要传递一个名称中带有连字符的参数。我们称之为"data-param"。由于 C# 名称中不允许使用连字符,因此我不能以上述方式执行此操作。我知道在 MVC 的某些地方,下划线用于处理这个问题,但这在这里也不起作用,下划线按原样传递给查询字符串。

所以我的问题是,我如何重定向到/Index?data-param=hello

【问题讨论】:

  • 当您说您需要 传递一个带有连字符名称的参数时,这是一个关键要求吗?有时最简单的解决方案是顺其自然。但是,我认为自第 2 版以来这并没有太大变化,因此您可以查看:stackoverflow.com/questions/2782156/…
  • 不幸的是,它是用于第 3 方库的,所以是的,我确实需要通过连字符来传递它。
  • 我在搜索有关此主题的帮助时确实遇到了链接的问题,但它似乎并不是我在这里寻找的。我(可能很明显)对 MVC 和 ASP 非常陌生,所以我可能会遗漏一些东西。我的意思是链接的问题是关于从包含连字符的第 3 方库接收参数,但我想要相反 - 将参数发送到第 3 方库。

标签: c# asp.net-mvc asp.net-mvc-4 query-string


【解决方案1】:

如果您尝试构建一个 url,您总是可以稍微绕过 MVC 路由并以老式方式传递完整的 url。

string dataParam="hello";
int otherParam=5;
return Redirect( String.Format("/Index?data-param={0}&data-param2={1}", dataParam, otherParam) );

如果您要跳出自己的 MVC 应用程序,那么您可能不想要 RedirectToAction,除非您重定向到某个操作。

【讨论】:

  • 索引控制器是 MVC 应用程序的一部分,但在它呈现的视图上是一个使用 3rd 方库的组件,它从查询字符串中获取所需的数据。由于我是 MVC 的新手,我不完全确定使用 Redirect 而不是 RedirectToAction 的后果,但它似乎在这种情况下有效,所以谢谢!
  • 基本上,RedirectToAction 将管理大量与查找应用程序根目录和必要时整理路径有关的事情。在可以使用的地方很方便,但是只要您有意识地需要注意路径(例如,当您在虚拟目录而不是站点根目录中运行时),那么绕过它并没有什么害处——URL无论哪种方式都应该工作。
  • 看起来更好的方法是使用 Url.Action("Index") 获取索引控制器的 URL,而不是在字符串中硬编码它,并使用 Redirect 如上所述.
  • 是的,仅当您在自己的应用程序中进行重定向时。该动作路由只会找到它知道的动作,所以如果你想将数据发送到另一台服务器上的朋友的 PHP 应用程序,你会很不走运。
【解决方案2】:

这可行(我使用的是 ASP.NET Core 3.1,无法与早期版本对话):

var params = new Dictionary<string, string>()
{
    { "data-param1", "hello" }
    { "data-param1", "2" }
};
return RedirectToAction("Index", params);

您可以根据需要使用Dictionary&lt;string, object&gt;(),但您会放弃一些控制权(例如,false 在 URL 中被转换为 "False" 而不是 "false")。您应该使用nameof() 以获得更好的可维护性:

var params = new Dictionary<string, object>()
{
    { "data-param1", "hello" }
    { "data-param2", 2 }
};
return RedirectToAction(nameof(Index), params);

另请注意,此字典技术也适用于其他方法,例如 RedirectToRoute()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多