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

ASP.NET Razor Pages视图模型错误消息本地化问题求助

解决ASP.NET Razor Pages本地化错误消息的资源访问问题

问题根源

你代码里typeof(Resources)引用的是Microsoft.AspNetCore.Hosting命名空间下的系统内置Resources类,而非你自己创建的SignUp.resx生成的自定义资源类,这才触发了“保护级别无法访问”的错误。

解决方案一:正确引用自定义资源类

1. 确认资源文件的生成配置

你的资源文件路径为App.Endpoints.RazorPages.UI\Resources\Areas\Account\Pages\SignUp.{lang}.resx,需先确保以下配置正确:

  • 右键资源文件→属性,将「自定义工具」设置为PublicResXFileCodeGenerator
  • 右键资源文件→打开方式→资源设计器,在设计器顶部的「访问修饰符」下拉框中选择Public
    此时资源文件会生成命名空间为App.Endpoints.RazorPages.UI.Resources.Areas.Account.Pages、类名为SignUp的公开资源类。

2. 修正ViewModel的特性配置

在SignUpVM中,把ErrorMessageResourceType指向你自己的资源类:

// 添加命名空间引用
using App.Endpoints.RazorPages.UI.Resources.Areas.Account.Pages;

public class SignUpVM
{
    [Required(ErrorMessageResourceName = "username_required", ErrorMessageResourceType = typeof(SignUp))]
    [StringLength(32)]
    public string UserName { get; set; }
    // 其他属性...
}

解决方案二:使用全局共享资源(更简洁的方案)

如果想统一管理所有本地化字符串,可采用全局共享资源的方式:

  1. 在项目Resources目录下创建SharedResources.resx及对应语言版本(如SharedResources.fa.resx、SharedResources.en.resx),同样设置访问修饰符为Public。
  2. 在Program.cs中配置本地化服务,指定共享资源类型:
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

builder.Services.AddRazorPages()
    .AddViewLocalization()
    .AddDataAnnotationsLocalization(options =>
    {
        options.DataAnnotationLocalizerProvider = (type, factory) =>
            factory.Create(typeof(SharedResources));
    });
  1. 此时ViewModel的特性可简化为:
public class SignUpVM
{
    [Required(ErrorMessage = "username_required")]
    [StringLength(32)]
    public string UserName { get; set; }
    // 其他属性...
}

框架会自动从SharedResources.resx中匹配对应键的本地化文本。

额外注意事项

  • 确保Program.cs中已启用本地化中间件:添加app.UseRequestLocalization();,并配置支持的文化(如fa-IR、en-US)。
  • 检查资源文件中是否存在username_required对应的键值对,避免出现文本找不到的情况。

内容的提问来源于stack exchange,提问作者Alireza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:45:05