ASP.NET Core MVC多语言网站DTO表单POST模型绑定报错求助
解决方案
1. 确保DTO的无参构造函数为public
模型绑定器只能通过公共无参构造函数实例化DTO对象,检查你的RegisterUserDto类,确认无参构造使用public修饰:
public class RegisterUserDto { // 供模型绑定器使用的公共无参构造 public RegisterUserDto() { } // 注入LanguageService的构造函数仅用于手动实例化场景(比如视图中) public RegisterUserDto(LanguageService languageService) { // 此处逻辑仅在你手动new DTO时生效,模型绑定不会调用此构造 } // 带验证特性的属性 [Required] [CustomLocalizedDisplayName("UsernameKey")] public string Username { get; set; } }
2. 修复自定义特性的服务依赖问题
不要在自定义特性的构造函数中注入LanguageService(特性是编译时实例化,无法从DI容器获取服务),改用运行时上下文获取服务:
自定义显示名称特性示例
public class CustomLocalizedDisplayNameAttribute : DisplayNameAttribute { private readonly string _resourceKey; public CustomLocalizedDisplayNameAttribute(string resourceKey) : base(resourceKey) { _resourceKey = resourceKey; } public override string DisplayName { get { // 从当前请求的服务容器中获取LanguageService var httpContext = new HttpContextAccessor().HttpContext; var languageService = httpContext?.RequestServices.GetService<LanguageService>(); return languageService?.GetLocalizedString(_resourceKey) ?? base.DisplayName; } } }
自定义验证特性示例
public class LocalizedRequiredAttribute : RequiredAttribute { private readonly string _errorMessageKey; public LocalizedRequiredAttribute(string errorMessageKey) { _errorMessageKey = errorMessageKey; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { // 通过ValidationContext获取DI容器中的服务 var languageService = (LanguageService)validationContext.GetService(typeof(LanguageService)); ErrorMessage = languageService.GetLocalizedString(_errorMessageKey); return base.IsValid(value, validationContext); } }
3. 优先使用ASP.NET Core内置本地化功能
避免自定义逻辑的潜在问题,直接用框架内置特性绑定资源文件:
[Required(ErrorMessageResourceName = "RequiredError", ErrorMessageResourceType = typeof(Resources))] [Display(Name = "Username", ResourceType = typeof(Resources))] public string Username { get; set; }
只需在项目中添加对应语言的资源文件(如Resources.resx、Resources.zh-CN.resx),框架会自动根据当前文化读取对应文本,无需手动处理服务注入。
4. 检查控制器POST方法参数
确保控制器的POST方法参数无错误配置,不要添加[FromServices]这类会干扰模型绑定的特性:
[HttpPost] public IActionResult Register(RegisterUserDto model) { if (!ModelState.IsValid) { return View(model); } // 处理注册逻辑 return RedirectToAction("Index"); }
内容的提问来源于stack exchange,提问作者Mousavi
相关产品推荐
相关产品推荐

