Asp.net mvc 在.net Core中按名称定义MVC路由
我定义了两条路线:Asp.net mvc 在.net Core中按名称定义MVC路由,asp.net-mvc,asp.net-core,routes,Asp.net Mvc,Asp.net Core,Routes,我定义了两条路线: app.UseEndpoints(endpoints => { endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute("api", "{controller=Home}/api/v1/{action=Index}/{id?}");
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute("api", "{controller=Home}/api/v1/{action=Index}/{id?}");
});
在控制器中,如果我没有在控制器中指定路由,它将使用其中一个。两个URL都可以工作:
我希望它只与第一个url一起工作,但是如果向控制器添加例如[Route(“api”)],则上述路由都不起作用
[Route("api")] //with this line it returns 404
public mymodel ID(int? id)
{
//some code
}
从:
路由名称可用于基于特定路由生成URL。路由名称对路由的URL匹配行为没有影响,仅用于URL生成。路由名称在应用程序范围内必须是唯一的
以下是自定义actionfilter属性的解决方法,该属性检查url是否与api的路由模板匹配,您可以参考:
ApiRouteTemplateAttribute
控制器
结果
Reference我已经读过了,所以似乎添加路由名称应该可以。我一定是遗漏了什么。您不是在添加路由名称,而是在为基于属性的路由添加路由模板<代码>使用端点用于基于约定的路由。两个独立的概念如果我将路由直接添加到控制器,它将按照我想要的方式工作[route(“[controller]/api/v1/id/{id?}”)],但我希望能够从启动类中选择模板,而不是在控制器中编写整个路由。
public class ApiRouteTemplateAttribute:ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
var routeTemplate = "{controller=Home}/api/v1/{action=Index}/{id?}";
var template = TemplateParser.Parse(routeTemplate);
var matcher = new TemplateMatcher(template, GetDefaults(template));
var routeValues = new RouteValueDictionary();
string LocalPath = context.HttpContext.Request.Path;
var result = matcher.TryMatch(LocalPath, routeValues);
//if the match is false ,return a exception information.
if (!result)
{
context.Result = new BadRequestObjectResult(new Exception("The url is incorrect!"));
}
}
private RouteValueDictionary GetDefaults(RouteTemplate parsedTemplate)
{
var result = new RouteValueDictionary();
foreach (var parameter in parsedTemplate.Parameters)
{
if (parameter.DefaultValue != null)
{
result.Add(parameter.Name, parameter.DefaultValue);
}
}
return result;
}
}
[ApiRouteTemplate]
public Exam ID(int? id)
{
return _context.Exams.Find(id);
}