ASP.NET Core 6 MVC Program.cs配置及REST风格路由恢复问题
2. 迁移后REST风格URL传参的修复方案
你的问题源于约定路由的参数覆盖范围不足和ActionLink的参数错误,以下是具体修复步骤:
问题根源
- 全局约定路由
{controller=Home}/{action=Index}/{id?}仅定义了id作为路由参数,code不在模板内,因此ActionLink会自动将其放入查询字符串 ActionLink的控制器参数错误:应传入"Vendor"而非"VendorController"(ASP.NET Core会自动补全Controller后缀)
修复步骤
方案1:扩展全局约定路由
若希望多个参数都通过REST风格URL传递,修改默认路由模板,将需要的参数加入:
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}/{code?}"); });
提示:
?表示参数可选,若id和code为必填项,可去掉?
方案2:修正ActionLink参数
视图中的ActionLink控制器名称存在冗余后缀,修正后:
@Html.ActionLink("Vendors", "Index", "Vendor", new { @Id = 15153, @Code = "AGR3" }, null)
方案3:使用特性路由(更灵活)
若不想修改全局路由,可给控制器/动作方法添加特性路由,精准控制URL格式:
[Route("[controller]/[action]/{id}/{code}")] public class VendorController : Controller { [HttpGet] public ActionResult Index(int id, string code) { var model = _dataService.GetVendorInfo(id, code); return View("Index", model); } }
此方式下,ActionLink会自动匹配特性路由,生成/Vendor/Index/15153/AGR3格式的URL。
额外优化:移除冗余代码
示例Program.cs中存在两处重复的控制器服务注册:AddControllersWithViews()已包含AddControllers()的功能,可删除builder.Services.AddControllers()相关代码;同时手动构建ConfigurationBuilder属于冗余操作,builder.Configuration已默认加载配置源,可直接使用。
内容的提问来源于stack exchange,提问作者endurium
相关产品推荐
相关产品推荐

