【问题标题】:Asp.Net Core routing parameters always 0 or nullAsp.Net Core 路由参数始终为 0 或 null
【发布时间】:2019-02-07 07:45:06
【问题描述】:

我已经具备了我认为非常标准的控制器的条件:

这是控制器定义(有点依赖注入,但标准):

public class SeriesController : Controller
{
    private readonly IHostingEnvironment  _env;

    public SeriesController(IHostingEnvironment env)
    {
        _env = env;
    }

    [HttpGet("/series/{id:int?}/{title?}")]
    public IActionResult Index(int id, string title)
    {
        if (id > 0)
        {
            var populateSeriesItem = new PopulateSeriesItem(_env, new SqlConnection());

            var seriesItem = populateSeriesItem.GenerateSeriesItem(id);

    //...

如果 id 不存在(或 0),则显示所有记录;如果为 1 或更大,则显示单个记录。 (这就是客户想要的!)

我这样称呼它:

https://localhost/series/3/title

https://localhost/series/4/

但问题是 id 始终为 0(并且 title 为空)。

如果我在 URL 栏中键入它或手动指定 id(即 /series?id=3),就会出现这种情况

我就是想不通我错过了什么。

完全相同的设置与不同的控制器完美配合。

    [HttpGet("/books/{id:int?}/{title?}")]
    public ActionResult Index(int id, string title)
    {
        if (id > 0)
        {
            var populateBookItem = new PopulateBookItem(new  SqlConnection(), _env);

            var bookItem = populateBookItem.GenerateBookItem(id);

那个有效。

这是路由配置(只是标准):

app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

我一定遗漏了一些明显的东西,但我很困惑!

非常感谢任何建议。

更新:

我已经从控制器中剥离了所有功能。我只是将它传递给视图。

这有效:https://localhost:44319/series/14/megacities - 视图报告 id = 14。

这有效:https://localhost:44319/series/5/megacities - 视图报告 id = 5

这有效:https://localhost:44319/series/14/business-with-china - 视图报告 id = 14。

这不起作用:https://localhost:44319/series/5/business-with-china - 它转到https://localhost:44319/series/0

还有其他 URL 遵循相同的模式。有些工作,有些不工作。

如果我去掉标题参数,它们似乎都可以工作。

我不知道为什么!

【问题讨论】:

  • 可以分享路由配置吗?
  • 我已经在上面添加了!谢谢。
  • 你试过把 [FromRoute] 放在你的参数前面吗?
  • 谢谢。 [FromRoute} 没有任何区别。 :(
  • 对不起,哪个前导斜线? - 所以它读作 series/{id;int?}/{title?}

标签: asp.net asp.net-mvc asp.net-core routing asp.net-core-2.0


【解决方案1】:
  1. 删除routes.MapRoute,Web API 不需要。
  2. HTTPGet 应该类似于[HttpGet("/books/{id:int?}")]
  3. 添加查询参数以请求GET api/books/5?title=abc
  4. 方法定义:
 [HttpGet("/books/{id:int?}")]
 public ActionResult Index(int id, [FromQuery] string title)
 {
    //code here
 }

【讨论】:

  • 它不是 Web API。标准 MVC。
  • @user5956088 理解。我们有两种方法来指定路由:MapRoute 或 Attributes。您可以在通常情况下离开 MapRoute 并按照我所说的修改属性。
【解决方案2】:

如果名称不匹配,参数将解析为默认值 - 如果是数字则为 0,否则为 null 在下面的示例中,url 具有 param1,而方法具有参数名称为 param2。

[HttpGet("/foo/{param1}")]
public ActionResult Foo(int param2)
{
  //code here
}

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,所以我找到了这个链接。我不小心找到了我的问题的解决方案,所以我什至它与您的问题无关,我将它发布给任何来到这里可能与我有同样问题的人。 我正在使用 C# 和 .net Core 2.2 无论我做什么,我都将 id 值设为 0。 碰巧我选择的参数名是“page”,页码,需要和{id?}中指定的“id”同名

    【讨论】:

      【解决方案4】:

      感谢大家的帮助。

      我已经解决了这个问题,但我不知道是什么原因造成的。 (我认为这可能是浏览器缓存问题。)

      无论如何,我重新启动了服务器,现在一切正常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-26
        • 2021-11-03
        • 1970-01-01
        • 2019-04-15
        • 2017-06-06
        • 1970-01-01
        • 2016-11-22
        • 2017-06-07
        相关资源
        最近更新 更多