【问题标题】:Route id not being picked up in Asp.Net Core MVC controller action在 Asp.Net Core MVC 控制器操作中未获取路由 id
【发布时间】:2018-03-13 12:42:20
【问题描述】:

给定以下 HTML:

 <li>
     <a asp-area="" asp-controller="Product" asp-action="Products" asp-route-id="0">
        <i class="si si-drop"></i>
        <span class="sidebar-mini-hide">EnerBurn</span>
      </a>
  </li>

产生这个 URL:

https://localhost:44356/Product/Products/0

但是在这个控制器动作中,选择的变量总是 0。 为什么控制器操作没有从 URL 路由中获取 id? 这是HttpGet 控制器操作:

public IActionResult Products(int selected)
{
    var pivm = new ProductInfoViewModel {SelectedId = selected};
    pivm= UpdateModelFromSelectedId(pivm);
    return View(pivm);
}

【问题讨论】:

  • 你试过将你的动作参数命名为id
  • 或使用 asp-route-selected="0" 代替 asp-route-id

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

使用您当前的操作定义,MVC 会尝试从查询参数中填充 selected 值(这是默认设置)并在您将其作为 URL 的一部分传递时失败。

因此,如果您希望它成为 URL 的一部分,您需要明确指定它作为路由的一部分:

  • 通过路由属性:

    [Route("Product/Products/{selected}")]
    public IActionResult Products(int selected)
    
  • 或者如果你使用约定路由

    routes.MapRoute("products", {controller=Product}/{action=Products}/{selected?}");
    

【讨论】:

  • @Set...如果我希望属性是字符串值而不是 int,我该怎么做?
  • @dinotom 如果您询问约束设置,请检查Route Constraint Reference。如果您只想更改参数类型 - 只需将方法的参数修改为 string selected
  • 这是完全错误的。路由忽略查询字符串参数。查询字符串值由Value Providers 传递给操作方法。如果你传递 URL /product/products?selected=123 它根本不会匹配这个属性路由。
  • @NightOwl888 只是重读问题 - 他想要一个像 /product/products/selected 这样的 URL
  • 好的,我仍然坚持这样一个事实,即查询参数根本不会被路由拾取,除非您自定义路由以考虑它们。您应该从答案中删除该部分。
【解决方案2】:

更改代码并输入id而不是selected:

public IActionResult Products(int id)
{
    var pivm = new ProductInfoViewModel {SelectedId = id};
    pivm= UpdateModelFromSelectedId(pivm);
    return View(pivm);
}

【讨论】:

    【解决方案3】:

    为什么使用“int selected”?它需要自定义路由。

    使用“字符串 id”,MVC 会默认为您处理。 如果您需要输入参数为 int,则将其转换为 int(在 try catch 中?)。

    //in: id represents selected index
    public IActionResult Products(string id)
    {
    int selected = Convert.ToUInt32(id);
    //do work....
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多