我有一个写在 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)
如何在操作和/或视图中获取路线名称?
这基本上就是我所拥有的,一个非常简单的三个文件集,带有新的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
我对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) 我正在尝试定义一个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)
当然,必须有一种方法来定义一条路线来覆盖所有区域?
我错过了什么,我受到了404这个控制器的欢迎?我真的不想使用基于属性的路由.我也不想action成为任何URI的一部分.
我正在使用Visual Studio 2017和.Net Core 1.1.
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.
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) 我正在尝试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
如果我有一个控制器,其操作方法使用基于属性的路由并像这样声明它,那么一切都很好:
[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)
必须有某种方法来解决此错误。知道办法吗?
我想构建真正的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]我正在将项目迁移到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) 我正在尝试从 .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等。