You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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">
            &ensp; @lang.Login
        </button>
    </div>
</form>

为什么原来的代码不工作?

你之前的代码里,lang变量是在if和else块内部分别声明的,这意味着变量的作用域只限于各自的块,块外面的HTML根本不知道这个变量存在,所以会编译报错。通过先在块外声明接口类型的变量,再在块内赋值,就能让整个页面的代码都访问到lang了。

另外,用接口的好处是以后如果要新增其他语言,只需要新建一个类实现ILanguage接口,然后在if/else里加对应的判断即可,扩展性非常好。

备注:内容来源于stack exchange,提问作者Fillo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 11:24:49