Asp.Net核心路由参数始终为0或null

问题描述 投票:0回答:2

我已经拥有了一个非常标准的控制器:

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

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(并且标题为null)。

如果我在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遵循相同的模式。有些工作,有些不工作。

如果我删除title参数,它们似乎都可以工作。

我不明白为什么!

asp.net asp.net-mvc asp.net-core routing asp.net-core-2.0
2个回答
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
 }

0
投票

谢谢大家的帮助。

我已经解决了这个问题,虽然我不知道是什么导致了它。 (我认为这可能是浏览器缓存问题。)

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


0
投票

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

[HttpGet("/foo/{param1}")]
public ActionResult Foo(int param2)
{
  //code here
}
© www.soinside.com 2019 - 2024. All rights reserved.