.NET Core 7.0 Razor页面中如何通过自定义语言类实现多语言切换显示
.NET Core 7.0 Razor页面中如何通过自定义语言类实现多语言切换显示
我看了你的问题,核心问题是你在if/else块里声明的lang变量作用域仅限于块内部,导致外面的HTML代码无法访问到它,这就是代码不工作的原因。咱们一步步来解决这个问题:
第一步:定义公共接口统一语言类结构
首先,咱们创建一个公共接口,把所有需要的语言属性都定义进去,这样两个语言类都实现这个接口,保证类型一致,方便后续统一调用:
public interface ILanguage { string Email { get; } string Password { get; } string Login { get; } }
第二步:修改语言类实现接口
把你的英文和意大利语类改成实现这个接口的形式(用属性替代字段更符合C#编码规范):
// 英文语言类 public class LanguageEnglishExtensions : ILanguage { public string Email => "Email"; public string Password => "Password"; public string Login => "Login"; } // 意大利语语言类 public class LanguageItalianExtensions : ILanguage { public string Email => "Indirizzo email"; public string Password => "Password"; public string Login => "Entra"; }
第三步:在页面模型中处理语言切换参数
在你的Connect.cshtml.cs页面模型里,要接收路由传来的id参数,并更新TempData里的gg值,同时处理第一次访问的默认情况(默认用英文):
public class ConnectModel : PageModel { [TempData] public int gg { get; set; } // 处理GET请求,接收语言切换的id参数 public void OnGet(int? id) { // 如果有传入id,更新语言标识 if (id.HasValue) { gg = id.Value; } // 第一次访问时,gg可能为空,默认设为1(英文) else if (gg == 0) { gg = 1; } } // 你的输入模型保持不变 public InputModel Input { get; set; } public class InputModel { public string Email { get; set; } public string Password { get; set; } } }
第四步:修正前端Razor代码的变量作用域
现在在前端页面里,先在if/else块外面声明接口类型的lang变量,然后在块内根据gg的值实例化对应的语言类,这样整个页面都能访问到lang了:
@{ // 先在块外声明ILanguage类型的变量 ILanguage lang; // 处理默认情况,确保gg不会是0或无效值 var currentLangId = gg <= 0 ? 1 : gg; if (currentLangId == 1) { lang = new LanguageEnglishExtensions(); } else { lang = new LanguageItalianExtensions(); } } <form id="account" method="post"> <a asp-page="/Connect" asp-route-id="1" class="btn btn-outline-primary">EN</a> <a asp-page="/Connect" asp-route-id="2" class="btn btn-outline-primary">IT</a> <div asp-validation-summary="All" class="text-danger"></div> <div class="form-floating"> <input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" /> <label asp-for="Input.Email" class="form-label">@lang.Email</label> <span asp-validation-for="Input.Email" class="text-danger"></span> </div> <div class="form-floating"> <input asp-for="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" style="text-align:center;" /> <label asp-for="Input.Password" class="form-label">@lang.Password</label> <span asp-validation-for="Input.Password" class="text-danger"></span> </div> <div class="form-group text-center"> <br> <button type="submit" class="btn btn-outline-primary border-light">   @lang.Login </button> </div> </form>
为什么原来的代码不工作?
你之前的代码里,lang变量是在if和else块内部分别声明的,这意味着变量的作用域只限于各自的块,块外面的HTML根本不知道这个变量存在,所以会编译报错。通过先在块外声明接口类型的变量,再在块内赋值,就能让整个页面的代码都访问到lang了。
另外,用接口的好处是以后如果要新增其他语言,只需要新建一个类实现ILanguage接口,然后在if/else里加对应的判断即可,扩展性非常好。
备注:内容来源于stack exchange,提问作者Fillo
相关产品推荐
相关产品推荐

