gpt4 book ai didi

asp.net-mvc - ASP.NET MVC QueryString 默认覆盖提供的值?

转载 作者:行者123 更新时间:2023-12-03 10:37:58 24 4
gpt4 key购买 nike

使用 ASP.NET MVC 预览 5(尽管这也已在 Beta 中尝试过),路由中的查询字符串默认值似乎覆盖了在查询字符串中传递的值。重现是编写这样的 Controller :

public class TestController : Controller
{
public ActionResult Foo(int x)
{
Trace.WriteLine(x);
Trace.WriteLine(this.HttpContext.Request.QueryString["x"]);
return new EmptyResult();
}
}

路由映射如下:
routes.MapRoute(
"test",
"Test/Foo",
new { controller = "Test", action = "Foo", x = 1 });

然后用这个相对 URI 调用它:
/Test/Foo?x=5

我看到的跟踪输出是:
1
5

因此,换句话说,为路由设置的默认值始终传递到方法中,而不管它是否实际在查询字符串上提供。请注意,如果删除了查询字符串的默认值,即路由映射如下:
routes.MapRoute(
"test",
"Test/Foo",
new { controller = "Test", action = "Foo" });

然后 Controller 按预期运行,并将值作为参数值传入,给出跟踪输出:
5
5

这在我看来就像一个错误,但我会发现这样的错误仍然存​​在于 ASP.NET MVC 框架的 beta 版本中非常令人惊讶,因为具有默认值的查询字符串并不是一个深奥的或边缘情况的功能,所以这几乎肯定是我的错。任何想法我做错了什么?

最佳答案

使用 QueryStrings 查看 ASP.NET MVC 的最佳方法是将它们视为路由不知道的值。正如您所发现的,QueryString 不是 RouteData 的一部分,因此,您应该将作为查询字符串传递的内容与路由值分开。

如果从 QueryString 传递的值为空,则解决这些问题的一种方法是在操作中自己创建默认值。

在您的示例中,路由知道 x,因此您的 url 应该看起来像这样:

/Test/Foo or /Test/Foo/5

路线应该是这样的:
routes.MapRoute("test", "Test/Foo/{x}", new {controller = "Test", action = "Foo", x = 1});

获得您正在寻找的行为。

如果你想传递一个 QueryString 值,比如页码,那么你可以这样做:
/Test/Foo/5?page=1

你的 Action 应该像这样改变:
public ActionResult Foo(int x, int? page)
{
Trace.WriteLine(x);
Trace.WriteLine(page.HasValue ? page.Value : 1);
return new EmptyResult();
}

现在测试:

Url:  /Test/Foo
Trace:
1
1

Url: /Test/Foo/5
Trace:
5
1

Url: /Test/Foo/5?page=2
Trace:
5
2

Url: /Test/Foo?page=2
Trace:
1
2


希望这有助于澄清一些事情。

关于asp.net-mvc - ASP.NET MVC QueryString 默认覆盖提供的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/458288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com