C# ASP.Net核心路由-无法确定带参数的GET无法路由到的原因
我一直试图让一个简单的参数得到工作,但它保持路由到参数较少的得到。当我删除参数less GET时,它根本找不到它,并给我一个404 我尝试了路由属性和HttpGet属性的不同变体,但都没有用。我觉得我错过了一些简单的东西 控制器C# ASP.Net核心路由-无法确定带参数的GET无法路由到的原因,c#,asp.net-core,asp.net-core-mvc,url-routing,C#,Asp.net Core,Asp.net Core Mvc,Url Routing,我一直试图让一个简单的参数得到工作,但它保持路由到参数较少的得到。当我删除参数less GET时,它根本找不到它,并给我一个404 我尝试了路由属性和HttpGet属性的不同变体,但都没有用。我觉得我错过了一些简单的东西 控制器 [Route("api/[Controller]")] public class ModelController : Controller { private readonly IDataRepository _repositor
[Route("api/[Controller]")]
public class ModelController : Controller
{
private readonly IDataRepository _repository;
private readonly ILogger<VehicleController> _logger;
public ModelController(IDataRepository repository, ILogger<VehicleController> logger)
{
_repository = repository;
_logger = logger;
}
[HttpGet]
public IActionResult Get()
{
try
{
return Ok(_repository.GetAllModels());
}
catch (Exception ex)
{
_logger.LogError($"Failed to get models : {ex}");
return BadRequest("Failed to get models");
}
}
[HttpGet("{id:Guid}")]
public IActionResult GetAllModelsById(Guid id)
{
try
{
return Ok(_repository.GetModelsByMaker(id));
}
catch (Exception ex)
{
_logger.LogError($"Failed to get models for maker : {ex}");
return BadRequest("Failed to get models for maker");
}
}
}
[路由(“api/[控制器]”)]
公共类ModelController:控制器
{
专用只读IDataRepository_存储库;
专用只读ILogger\u记录器;
公共模型控制器(IDataRepository存储库、ILogger记录器)
{
_存储库=存储库;
_记录器=记录器;
}
[HttpGet]
public IActionResult Get()
{
尝试
{
返回Ok(_repository.GetAllModels());
}
捕获(例外情况除外)
{
_logger.LogError($“无法获取模型:{ex}”);
返回错误请求(“获取模型失败”);
}
}
[HttpGet(“{id:Guid}”)]
public IActionResult GetAllModelsById(Guid id)
{
尝试
{
返回Ok(_repository.GetModelsByMaker(id));
}
捕获(例外情况除外)
{
_logger.LogError($“无法获取生成器的模型:{ex}”);
返回BADDREQUEST(“未能为制造商获取模型”);
}
}
}
启动
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<DataContext>(cfg =>
cfg.UseSqlServer(_config.GetConnectionString("WebAppConnectionString")));
services.AddControllersWithViews();
services.AddTransient<DataSeeder>();
services.AddScoped<IDataRepository, DataRepository>();
services.AddAutoMapper(Assembly.GetExecutingAssembly());
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
});
});
//app.UseEndpoints(x => x.MapControllers());
}
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(cfg=>
UseSqlServer(_config.GetConnectionString(“WebAppConnectionString”));
services.AddControllersWithViews();
services.AddTransient();
services.addScope();
AddAutoMapper(Assembly.getExecutionGassembly());
}
//此方法由运行时调用。使用此方法配置HTTP请求管道。
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(端点=>
{
endpoints.MapControllers();
endpoints.MapGet(“/”,异步上下文=>
{
wait context.Response.WriteAsync(“Hello World!”);
});
});
//app.UseEndpoints(x=>x.MapController());
}
在AspNetCore 3.0中,我们可以使用静态和动态路由。动态路由似乎不是我们的情况
在静态路由中,我们可以选择两种不同的方法
第一个进近是硬编码的手动输入路线。
例如,如果我们想在应用程序的请求中显示我们的about页面,我们应该在controller中使用如下代码中的路由变体。此路由变体包含或,所有url将路由控制器的索引操作
您的关于控制器的设置似乎是使用类似此方法配置的。
[Route("")]
[Route("About")]
public IActionResult Index()
{
return View();
}
第二种方法是在启动时集中路由
您应该告诉应用程序,启动应用程序时将使用哪种路由模式
这很简单,您应该可以在创建新的asp.net核心mvc应用程序时看到
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
很好!我们说,在url中使用这种模式
“{controller=Home}/{action=Index}/{id?}”
让我向你解释
- 第一个出现的控制器名称,默认为Home ({controller=Home})
- 然后是(/)动作名称,默认值为
索引({action=Index}) - 然后是(/)参数id,这可以是
空(可选)({id?})
在这种情况下,您的问题应该解决,请选择其中一种方法。您尝试使用的URL是什么?