ASP.NET Core如何无需为每个参数追加斜杠向视图传递多参数
更优实现方案
方案1:使用查询字符串传递参数(无需修改全局路由)
你完全不需要修改默认全局路由规则,默认的{controller=Home}/{action=Index}/{id?}路由已经可以满足需求:未在路由模板中定义的参数会自动从查询字符串中读取并绑定到Action的入参。
你只需要把全局路由恢复为默认配置:
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
访问时按如下格式传参即可:/Product/DettaglioDescrizione?id=123&descrizione=这里是商品描述
方案2:给指定Action加特性路由(不影响全局路由规则)
如果你希望参数还是用路径分隔的形式,又不想改全局路由影响其他接口,可以仅给需要的Action添加特性路由:
首先在全局路由配置中保留默认规则,然后在DettaglioDescrizione方法上添加路由属性:
[Route("Product/DettaglioDescrizione/{id}/{descrizione?}")] public IActionResult DettaglioDescrizione(int id, string descrizione) { ViewData["ProductId"] = id; ViewData["ProductDescription"] = descrizione; return View("Details"); }
这样只有这个Action会匹配/Product/DettaglioDescrizione/123/xxx格式的请求,其他接口还是走默认路由规则。
额外优化建议
你可以用强类型视图模型替代ViewData传递数据,避免拼写错误的同时获得编译时类型检查:
- 定义视图模型类:
public class ProductDetailViewModel { public int Id { get; set; } public string Description { get; set; } }
- 控制器中传递模型:
public IActionResult DettaglioDescrizione(int id, string descrizione) { var model = new ProductDetailViewModel { Id = id, Description = descrizione }; return View("Details", model); }
- 视图中绑定模型:
@model ProductDetailViewModel <div class="text-center"> <h1 class="display-4">Prodotti</h1> <p>Id prodotto: @Model.Id</p> <p>Descrizione prodotto: @Model.Description</p> </div>
内容的提问来源于stack exchange,提问作者Antonio Argentieri
相关产品推荐
相关产品推荐

