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

时间:2018-09-01 15:34:02

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

我具备成为一个非常标准的控制器的能力:

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

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)。

就是这种情况,如果我在网址栏中输入它或手动指定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参数,它们似乎都可以工作。

我不知道为什么!

4 个答案:

答案 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
 }

答案 1 :(得分:1)

我遇到了同样的问题,所以我找到了此链接。我无意间找到了解决问题的方法,所以我什至与您都没有关系,我把它发布给任何来这里和我有同样问题的人。 我正在使用C#和.net Core 2.2 无论我做什么,我都将id值设为0。 碰巧,我选择的参数名称是页号“ page”,需要与{id?}

中指定的名称相同。

答案 2 :(得分:0)

感谢大家的帮助。

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

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

答案 3 :(得分:0)

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

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