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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:38:29