endpoints.MapControllerRoute(
name: "blog-list",
pattern: "{controller}/{category?}",
defaults: new { Controller = "Blog", Action = "List" }
);
endpoints.MapControllerRoute(
name: "blog-info",
pattern: "{controller}/{action}/{id?}"
);
比如说我想配置 /blog/58.html
其中58是id
假如 Action 名称是 Info ,可以使用下面的路由配置
endpoints.MapControllerRoute(
name: "blog-info",
pattern: "{controller}/{id}.html",
defaults: new { Controller = "Blog", Action = "Info" }
);
id 要怎么作为参数传入啊,framework mvc 中是这样指定id = UrlParameter.Optional。
但是core中这样指定好像不行
带后缀的伪链接,好像就不走路由了,不知道是不是需要设置什么?
@小兵程序: 答案中的路由就可以传入,我实际测试过了,建议提供一下 Action 的代码
@dudu:
public class BlogController : Controller
{
public IActionResult List(string category)
{
return View();
}
public IActionResult Info(string id)
{
return View();
}
}
我按照答案中的配置,直接就报了未找到。我的id是个类似于“abcd”这样的字符串,不是纯数字
@小兵程序: string
改为 int
@小兵程序 我也遇到了这个问题,在使用UseEndpoints终结点路由时,加了.html
endpoints.MapControllerRoute(
"default",
"{controller}/{action}.html",
new { controller = defaultController, action = defaultAction }
);
路由就报错,AmbiguousMatchException: The request matched multiple endpoints. Matches:
使用老款路由中间件就没问题
难受至极
我这个已经解决了。
比如配置
/aaa/bbb/mun.html(其中mun是参数,Action的接收变量为category,string类型)
endpoints.MapControllerRoute(
name: "blog-info",
pattern: "{aaa}/{bbb}/{category}.html",
defaults: new { Controller = "Blog", Action = "Category" }
);
比如配置
/aaa/bbb/18.html(其中18是参数,Action的接收变量为id,int类型)
endpoints.MapControllerRoute(
name: "blog-info",
pattern: "{aaa}/{bbb}/{id}.html",
defaults: new { Controller = "Blog", Action = "Detail" }
);
你这个配置应该是这样的:
假如你的Controller叫:Product,Action叫 Category
endpoints.MapControllerRoute(
"default",
"Product/Category.html",
new { controller = Product, action = Category}
);
好像controller和action作为链接的一部分时是不能加大括号的,否则就是直接走默认的。
还有就是注意路由的顺序,有的路由可能在前面都已经匹配了,最后都走不到你配的那个路由,结果自然就达不到你想要的效果
@小兵程序: 感谢,您说的这种情况就只能是写死路径么?目前我也放弃探索了,就两张方案
1是继续用回 app.UseMvc(routes =>
{
RouteConfig.RegisterRoutes(routes, app.ApplicationServices);
});
2是用默认的app.UseRouting();
app.UseEndpoints(endpoints =>
endpoints.MapControllerRoute(
"default",
"{controller}/{action}",
new { controller = defaultController, action = defaultAction }
)😉;
然后在各个Controller的基类上加一行[Route()],比如BaseController上加[Route("[controller]/[action].html")],BaseApiController上加[Route("api/[controller]/[action].html")]
目前我选了第二种方法
对应的 Controller 与 Action 名称是什么?
– dudu 4年前