C# ASP.Net核心路由-无法确定带参数的GET无法路由到的原因

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

我一直试图让一个简单的参数得到工作,但它保持路由到参数较少的得到。当我删除参数less GET时,它根本找不到它,并给我一个404

我尝试了路由属性和HttpGet属性的不同变体,但都没有用。我觉得我错过了一些简单的东西

控制器

    [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上写东西时,应用程序将使用哪个路由。在默认路由中,我们使用主/索引url和路由,这意味着如果我们只点击,我们将获得主/索引操作


在这种情况下,您的问题应该解决,请选择其中一种方法。

您尝试使用的URL是什么?