【发布时间】:2023-03-08 21:17:01
【问题描述】:
我有 Asp.Net Core MVC Web 应用程序,其中有一个名为 AdminUI 的区域。
我的控制器如下所示:
[Area("AdminUI")]
public class ConfigurationController : BaseController
{
public async Task<IActionResult> Client(int? id)
{
if (id == default)
{
var clientDto = _clientService.BuildClientViewModel();
return View(clientDto);
}
var client = await _clientService.GetClientAsync(id.Value);
client = _clientService.BuildClientViewModel(client);
return View(client);
}
}
而且我也有以下方法来添加该功能以使用特定名称为整个区域添加前缀:
public static IEndpointConventionBuilder MapIdentityServer4AdminUI(
this IEndpointRouteBuilder endpoint, string patternPrefix = "/")
{
return endpoint.MapAreaControllerRoute("AdminUI", "AdminUI",
patternPrefix + "{controller=Home}/{action=Index}/{id?}");
}
如果我使用这个:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ILoggerFactory loggerFactory)
{
app.UseRouting();
app.UseEndpoints(endpoint =>
{
endpoint.MapIdentityServer4AdminUI("/myPrefix/");
});
}
我可以通过以下链接访问 AdminUI 区域:
https://localhost:43000/myPrefix/Configuration/Client
https://localhost:43000/myPrefix/Configuration/Client/2
它运作良好,但现在我需要限制上面的 URL,这可以只访问带有 id 的方法 Client 是数字或在 URL 中没有 id 参数。我不知道如何实现,如果我想在上面的 URL 中保留前缀。
我试过这个办法,还是不行:
[Route("[area]/[controller]/[action]")]
[Route("[area]/[controller]/[action]/{id:int}")]
public async Task<IActionResult> Client(int id)
{
...
}
这很有效,我只能使用像数字这样的 ID 而没有 ID,但这会破坏 URL,因为它忽略了我上面的前缀。
网址现在是:
https://localhost:43000/AdminUI/Configuration/Client
不是:
https://localhost:43000/myPrefix/Configuration/Client
如何实现以下行为?
【问题讨论】:
标签: asp.net-core asp.net-core-mvc asp.net-core-routing