标签: asp.net-core-routing

如何使用 ASP.NET Core 获取当前路由名称?

我有一个写在 ASP.NET Core 2.2 框架之上的应用程序。

我有以下控制器

public class TestController : Controller
{
    [Route("some-parameter-3/{name}/{id:int}/{page:int?}", Name = "SomeRoute3Name")]
    [Route("some-parameter-2/{name}/{id:int}/{page:int?}", Name = "SomeRoute2Name")]
    [Route("some-parameter-1/{name}/{id:int}/{page:int?}", Name = "SomeRoute1Name")]
    public ActionResult Act(ActVM viewModel)
    {
        // switch the logic based on the route name

        return View(viewModel);
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在操作和/或视图中获取路线名称?

c# asp.net-core asp.net-core-routing asp.net-core-2.2

11
推荐指数
2
解决办法
8458
查看次数

路由不适用于自托管的Web API

这基本上就是我所拥有的,一个非常简单的三个文件集,带有新的asp.net核心2.1(实际上是从教程中复制粘贴的):

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}
Run Code Online (Sandbox Code Playgroud)

然后是最简单的启动

class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMvc();
    }
}
Run Code Online (Sandbox Code Playgroud)

和默认值控制器

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2" };
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-core asp.net-core-webapi asp.net-core-routing asp.net-core-2.1

10
推荐指数
2
解决办法
3402
查看次数

是否可以在ASP.NET Core中组合[FromRoute]和[FromBody]?

我对API控制器有一个动作,如下所示:

[HttpPost]
public async Task<IActionResult> StartDeployment(
    [FromQuery]Guid deploymentId,
    [FromRoute]RequestInfo requestInfo,
    [FromBody]DeploymenRequest deploymentRequest)
{
}
Run Code Online (Sandbox Code Playgroud)

它由复杂的url(requestInfo)提供,并接收HTTP POST请求payload(deploymentRequest).

是否可以组合[FromRoute],[FromBody]所以我会有单一的请求模型:

public class UberDeploymentRequestInfo
{
    [FromQuery]public Guid DeploymentId { get; set; }

    [FromRoute]public RequestInfo RequestInfo { get; set; }

    [FromBody]public DeploymenRequest DeploymentRequest { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以我可以使用Fluent验证使用单个验证器:

internal class UberDeploymentRequestInfoValidator : AbstractValidator<UberDeploymentRequestInfo>
{
    public UberDeploymentRequestInfoValidator()
    {
        // validation rules can access both url and payload
    }
}
Run Code Online (Sandbox Code Playgroud)

c# fluentvalidation asp.net-core asp.net-core-routing

10
推荐指数
1
解决办法
1491
查看次数

如何定义到多个区域的端点路由

我正在尝试定义一个MapAreaControllerRoute()到多个区域的路由。但是,在 ASP.NET Core 3.0 中,有areaName:一个需要设置的参数,因此将每个路由限制在一个区域内。我不明白如何使用一条适用于多个区域的路线。

我已经阅读了有关 Stack Overflow 的许多问题,但似乎这是 ASP.NET Core 3.0 中的一个新要求。在 ASP.NET Core <= 2.2 中,您可以在MapRoute()不定义 set的情况下创建 a areaName

就像现在一样,在 my 中Startup.cs,我将端点定义为:

app.UseEndpoints(endpoints =>
{
  endpoints.MapAreaControllerRoute(
    name: "Area1",
    areaName: "Area1",
    pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
  );

  endpoints.MapAreaControllerRoute(
    name: "Area2",
    areaName: "Area2",
    pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
  );

  endpoints.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

});
Run Code Online (Sandbox Code Playgroud)

当然,必须有一种方法来定义一条路线来覆盖所有区域?

c# asp.net-mvc asp.net-core-routing asp.net-core-3.0

10
推荐指数
2
解决办法
8163
查看次数

ASP.Net Core Web API基于约定的路由?

我错过了什么,我受到了404这个控制器的欢迎?我真的不想使用基于属性的路由.我也不想action成为任何URI的一部分.

我正在使用Visual Studio 2017和.Net Core 1.1.

TestController.cs

using System;
using Microsoft.AspNetCore.Mvc;

namespace Foo.Controllers
{
    public class TestController : Controller
    {
        public long Get() => DateTimeOffset.Now.ToUnixTimeSeconds();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这适用于[Route("api/Test")]属性.但我不想使用基于属性的路由.一旦我取消该属性,我就会得到404.

Startup.cs

namespace Foo
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }

        public IConfigurationRoot Configuration { get; }

        // This method gets called by the runtime. Use …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-core asp.net-core-webapi asp.net-core-routing

9
推荐指数
1
解决办法
4504
查看次数

如何在启用ASP.NET Core 2.2 EndpointRouting的情况下使用RouteDataRequestCultureProvider?

我正在尝试RouteDataRequestCultureProvider在新的ASP.NET Core 2.2 MVC项目中使用。

我已经阅读了有关ASP.NET Core中路由的Microsoft文档,以了解2.2中引入的更改,但是我不明白为什么“文化”不被视为URL生成的环境值。

ConfigureServices在Startup.cs中进行了更新,以包括以下设置:

var supportedCultres = new[] { new CultureInfo("en"), new CultureInfo("fr") };
services.Configure<RequestLocalizationOptions>(options =>
{
    options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en");
    options.SupportedCultures = supportedCultres;
    options.SupportedUICultures = supportedCultres;
    options.RequestCultureProviders = new[] { new RouteDataRequestCultureProvider { Options = options } };
});
Run Code Online (Sandbox Code Playgroud)

我修改了应用程序和默认路由Configure以使用“文化”路径段:

var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value;
app.UseRequestLocalization(locOptions);
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{culture:regex(^(en|fr)$)}/{controller=Home}/{action=Index}/{id?}");
});
Run Code Online (Sandbox Code Playgroud)

HomeController.Index()当我按预期导航到/ en或/ fr时,此路线将解析为,但与锚定标记帮助器进行的其他操作的任何链接都将呈现为<a href="">(包括支架产生的“隐私”链接)。

关闭EnableEndpointRouting会导致锚标记助手再次工作:

services.AddMvc(opts => { opts.EnableEndpointRouting = false; …
Run Code Online (Sandbox Code Playgroud)

c# localization asp.net-core-mvc asp.net-core asp.net-core-routing

9
推荐指数
1
解决办法
602
查看次数

如何解决“包罗万象的参数只能显示为路线模板的最后一段”的问题。

如果我有一个控制器,其操作方法使用基于属性的路由并像这样声明它,那么一切都很好:

    [HttpGet]
    [Route("/dev/info/{*somevalue}")]
    public IActionResult Get(string somevalue) {

        return View();
    }
Run Code Online (Sandbox Code Playgroud)

我可以路由到上述操作方法,例如通过指定以/dev/info/hello-world或结尾的 url/dev/info/new-world

然而,我的业务要求是有一个如下所示的网址:/dev/hello-world/info/dev/new-world/info 并且有无数这样的网址,它们都需要路由到控制器上的相同操作方法。

我想在操作方法上设置基于属性的路由,如下所示:

    [HttpGet]
    [Route("/dev/{*somevalue}/info/")]
    public IActionResult Get(string somevalue) {

        return View();
    }
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,网络项目运行后我就会收到以下错误:

处理请求时发生未处理的异常。RouteCreationException:属性路由信息发生以下错误:

对于操作:“App.SomeController.Get (1-wwwSomeProject)”错误:包罗万象的参数只能显示为路由模板的最后一段。参数名称:routeTemplate Microsoft.AspNetCore.Mvc.Internal.AttributeRoute.GetRouteInfos(IReadOnlyList actions)

必须有某种方法来解决此错误。知道办法吗?

asp.net-core-mvc asp.net-core asp.net-core-routing

9
推荐指数
1
解决办法
1852
查看次数

是否有可能只有ASP.NET Core中的参数不同的多个GET?

我想构建真正的RESTful Web服务,所以不想利用RPC风格,所以目前有这样的:

[HttpGet]
[ActionName(nameof(GetByParticipant))]
public async Task<IActionResult> GetByParticipant([FromQuery]string participantId, [FromQuery]string participantType, [FromQuery]string programName)
{
}

[HttpGet]
[ActionName(nameof(GetByProgram))]
public async Task<IActionResult> GetByProgram([FromQuery]string programName)
{
}
Run Code Online (Sandbox Code Playgroud)

我相信这可以在ASP.NET Web API中使用.但我得到一个例外:

AmbiguousActionException:匹配多个动作.以下操作匹配路由数据并满足所有约束:

TermsController.GetByParticipant(ParticipantTerms.Api)

TermsController.GetByProgram(ParticipantTerms.Api)

这些属性都没有实际帮助:

  • [HttpGet]
  • [ActionName]
  • [FromQuery]

c# .net-core asp.net-core asp.net-core-routing

8
推荐指数
2
解决办法
2879
查看次数

ASP.NET核心属性路由

我正在将项目迁移到ASP Net Core,但是我无法配置这些路由,因为我使用属性来映射操作。

ASP.Net WebAPI2的代码

[Route("api/[controller]")]
public class SalesController : Controller
{
    // api/sales/1 -> ok
    [HttpGet]
    public HttpResponseMessage Get(int id)
    {
        // Logic
    }   

    // api/sales -> ok
    [HttpGet]
    public HttpResponseMessage Get([FromUri] PaginationHelper pagination)
    {
        // Logic
    }  

    // api/sales?me -> ok
    [ActionName("Get")]
    public HttpResponseMessage GetMe(bool? me)
    {
        // Logic
    }  
}
Run Code Online (Sandbox Code Playgroud)

ASP.Net Core的代码

在文件Startup.cs中设置app.UseMvc();。

[Route("api/[controller]")]
public class SalesController : Controller
{
    // api/sales/1 -> ok
    [HttpGet("{id}")]
    public IActionResult Get(int id)
    {
        // Logic
    }   

    // …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-core asp.net-core-2.0 asp.net-core-routing

7
推荐指数
2
解决办法
6108
查看次数

Endpoint Routing .net core 3-Multiple Area

我正在尝试从 .net core 2.2 路由迁移到 asp.net core 3 中的端点路由,并在启动时使用以下路由

我的 .net core 2.2 路线是

routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");

                routes.MapRoute(
                    name: "AppArea",
                    template: "{area:exists}/{controller=Home}/{did?}/{action=Index}/{id?}");
Run Code Online (Sandbox Code Playgroud)

.net core 3 路由

  app.UseEndpoints(routes =>
                {                    
                    routes.MapControllerRoute(
                         name:"default",
                         pattern:"{controller=Home}/{action=Index}/{id?}");

                    routes.MapAreaControllerRoute(
                        name: "areas",
                        areaName:  "myarea",
                            pattern: "{area:exists}/{controller=Home}/{did?}/{action=Index}/{id?}");                
                    routes.MapRazorPages();
                   });
Run Code Online (Sandbox Code Playgroud)

我的问题是在 .net core 2.2 以上配置映射多个区域,例如area1 area2等。

c# asp.net-core-routing asp.net-core-3.1

7
推荐指数
1
解决办法
8912
查看次数