使用可选值和默认值进行路由

问题描述

我正在尝试使用可选值(语言)实现路由,如果url没有给出路由,则为该路由的认值,例如“ de”。

我有以下测试控制器:

public IActionResult Index(string lang = "de")
{
    return View();
}

public IActionResult Privacy(string lang = "de")
{
    return View();
}

以及以下路由器配置:

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

所以我的预期结果应该是:

path:                                expected invocation:                    actual invocation
localhost:44305/                 --> invoke Index(string lang = "de")    --> working
locahlhost:44305/home/en/index   --> invoke Index(string lang = "en")    --> working
localhost:44305/home/privacy     --> invoke Privcay(string lang = "de")  --> ERROR!!! invoking Index(string lang = "privacy") 
localhost:44305/home/de/privacy  --> invoke Privacy(string lang = "de")  --> working
localhost:44305/home/en/privacy  --> invoke Privacy(string lang = "en")  --> working

如您所见,URL ../home/privacy出现问题,导致控制器认为是我的新语言字符串。

有什么建议可以预防吗?

解决方法

如下更改路线模板:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...