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; } // 其他属性... }
解决方案二:使用全局共享资源(更简洁的方案)
如果想统一管理所有本地化字符串,可采用全局共享资源的方式:
- 在项目
Resources目录下创建SharedResources.resx及对应语言版本(如SharedResources.fa.resx、SharedResources.en.resx),同样设置访问修饰符为Public。 - 在
Program.cs中配置本地化服务,指定共享资源类型:
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); builder.Services.AddRazorPages() .AddViewLocalization() .AddDataAnnotationsLocalization(options => { options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(SharedResources)); });
- 此时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
相关产品推荐
相关产品推荐

