Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何在Asp.Net内核中限制控制器动作和区域中的参数类型_Asp.net Core_Asp.net Core Mvc_Asp.net Core Routing - Fatal编程技术网

Asp.net core 如何在Asp.Net内核中限制控制器动作和区域中的参数类型

Asp.net core 如何在Asp.Net内核中限制控制器动作和区域中的参数类型,asp.net-core,asp.net-core-mvc,asp.net-core-routing,Asp.net Core,Asp.net Core Mvc,Asp.net Core Routing,我有Asp.Net核心MVCweb应用程序,其中有一个名为AdminUI的区域 我的控制器如下所示: [区域(“AdminUI”)] 公共类配置控制器:BaseController { 公共异步任务客户端(int?id) { if(id==默认值) { var clientDto=_clientService.BuildClientViewModel(); 返回视图(clientDto); } var client=wait_clientService.getclientsync(id.Valu

我有
Asp.Net核心MVC
web应用程序,其中有一个名为
AdminUI
的区域

我的控制器如下所示:

[区域(“AdminUI”)]
公共类配置控制器:BaseController
{
公共异步任务客户端(int?id)
{
if(id==默认值)
{
var clientDto=_clientService.BuildClientViewModel();
返回视图(clientDto);
}
var client=wait_clientService.getclientsync(id.Value);
client=\u clientService.BuildClientViewModel(客户端);
返回视图(客户端);
}
}
我还有以下方法可以添加特征,在整个区域前面加上特定的名称:

公共静态IEndpointConventionBuilder MapIdentityServer4AdminUI(
此IEndpointRouteBuilder端点,字符串patternPrefix=“/”)
{
返回endpoint.MapAreaControllerOute(“AdminUI”、“AdminUI”,
patternPrefix+“{controller=Home}/{action=Index}/{id?}”);
}
如果我使用这个:

public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境、,
伊洛格工厂(伐木厂)
{
app.UseRouting();
app.UseEndpoints(端点=>
{
endpoint.MapIdentityServer4AdminUI(“/myPrefix/”);
});
}
我可以通过以下链接访问AdminUI区域:

https://localhost:43000/myPrefix/Configuration/Client
https://localhost:43000/myPrefix/Configuration/Client/2
它工作得很好,但现在我需要限制上面的URL,即只能访问id为number或URL中没有id参数的方法客户端。我不知道如何实现,如果我想在URL上面保留前缀

我尝试过此解决方案,但不起作用:

[路由(“[区域]/[控制器]/[操作]”)
[路由(“[area]/[controller]/[action]/{id:int}”)]
公共异步任务客户端(int-id)
{
...
}
这样我就可以只使用类似ID的数字而不使用ID,但这会破坏URL,因为它忽略了上面的前缀

URL现在是:

https://localhost:43000/AdminUI/Configuration/Client
不是:

如何实现以下行为

然后,在控制器中,删除
路由
属性

[Area("AdminUI")]
public class ConfigurationController : BaseController
{
    public async Task<IActionResult> Client(int? id)
    {
        ...             
    }
}
对于ConfigurationController和action客户端,请使用以下选项:

endpoint.MapAreaControllerRoute("AdminUI", "AdminUI", patternPrefix + "{controller=Home}/{action=Index}/{id:int?}"); 
你知道如何结合这两种设置吗

恐怕我们不能这样做(添加两个路由模板:一个用于整个AdminUI区域,另一个用于AdminUI区域操作方法)。因为,如果我们同时添加它们,如果url与操作方法的路由模板不匹配,它将使用区域路由模板。我能想到的唯一方法是为每个操作方法添加多个路由模板,而不为整个区域添加路由模板。像这样:

endpoint.MapAreaControllerRoute("AdminUI", "AdminUI", patternPrefix + "Home/Index2/{id:int}");
[注意]上述路线仅适用于主控制器Index2操作方法


或者使用路由属性。

我想在这里定义前缀:
endpoint.MapIdentityServer4AdminUI(“/myPrefix/”)-这直接在控制器中,对我的场景没有用处。您知道是否可以在此处的路由定义中定义建议的解决方案<代码>端点.MapAreaControllerOute(“AdminUI”,“AdminUI”,patternPrefix+“{controller=Home}/{action=Index}/{id?}”)-以某种方式将这一行与客户端方法的新行结合起来?谢谢您好@Jenan,请检查我的更新,尝试按以下方式更改路由模板:
endpoint.mapareaControllerOute(“AdminUI”、“AdminUI”、patternPrefix+“{controller=Home}/{action=Index}/{id:int?}”)并删除路由属性。感谢您的更新,是否可以说-对于某些操作,请使用此新路由
endpoint.MapAreaControllerOute(“AdminUI”、“AdminUI”、patternPrefix+“{controller=Home}/{action=Index}/{id:int?}”)对于其余操作,是否使用默认值?谢谢你好@Jenan,我已经更新了,请检查一下。祝您有个美好的一天!
[Area("AdminUI")]
public class ConfigurationController : BaseController
{
    public async Task<IActionResult> Client(int? id)
    {
        ...             
    }
}
[Area("AdminUI")]
public class ConfigurationController : BaseController
{
    public async Task<IActionResult> Client(int? id)
    {
        ...             
    }
}
endpoint.MapAreaControllerRoute("AdminUI", "AdminUI",
      patternPrefix + "{controller=Home}/{action=Index}/{id?}") 
endpoint.MapAreaControllerRoute("AdminUI", "AdminUI", patternPrefix + "{controller=Home}/{action=Index}/{id:int?}"); 
endpoint.MapAreaControllerRoute("AdminUI", "AdminUI", patternPrefix + "Home/Index2/{id:int}");