如何传递名称包含连字符的查询字符串参数?



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

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

将转到/Index?param1=hello

但是我需要传递一个在名称中有连字符的参数。我们称它为"data-param"。由于c#名称中不允许使用连字符,所以我不能以上述方式做到这一点。我知道在MVC的一些地方,下划线被用来处理这个,但这也不工作在这里,下划线被传递给查询字符串。

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

如果你试图构建 url,你总是可以稍微绕过MVC路由,只通过传统的方式传递完整的url。

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

如果你要去你自己的MVC应用程序之外,那么你可能不希望RedirectToAction无论如何,除非你重定向到一个动作。

这个工作(我使用的是ASP)。. NET Core 3.1,不能使用更早的版本):

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

如果你想的话,你可以使用Dictionary<string, object>(),尽管你会放弃一些控制(例如,false在URL中被翻译成"False"而不是"false")。为了更好的可维护性,您应该使用nameof():

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

还要注意,这种字典技术也适用于其他方法,如RedirectToRoute()

最新更新