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

保存至数据库前修改用户输入:自动转换姓名为大写

好问题!除了你当前用的模型属性封装方法,还有几种实用的实现方式,我给你梳理一下:

1. 自定义验证属性(带自动转换)

这种方式既能做属性验证,又能顺便完成大写转换,适合需要同时校验字段合法性的场景:

public class ToUpperCaseAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value is string inputStr && !string.IsNullOrEmpty(inputStr))
        {
            // 直接修改模型对应的属性值
            var targetProperty = validationContext.ObjectType.GetProperty(validationContext.MemberName);
            targetProperty?.SetValue(validationContext.ObjectInstance, inputStr.ToUpper());
        }
        return ValidationResult.Success;
    }
}

之后在模型的Name属性上标记即可:

[ToUpperCase]
public string Name { get; set; }
2. 控制器Action内手动处理

如果只是个别接口需要转换,直接在接收参数后处理最直接,缺点是多个接口需要重复写代码:

[HttpPost]
public IActionResult Create(UserViewModel model)
{
    if (ModelState.IsValid)
    {
        // 转换后再保存
        model.Name = model.Name?.ToUpper();
        _userService.AddUser(model);
        return RedirectToAction(nameof(Index));
    }
    return View(model);
}
3. 自定义模型绑定器

可以在模型绑定阶段就完成转换,适合需要对特定属性或全局字符串做统一处理的场景:

public class UpperCaseStringBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (valueResult != ValueProviderResult.None)
        {
            var inputValue = valueResult.FirstValue;
            if (!string.IsNullOrEmpty(inputValue))
            {
                bindingContext.Result = ModelBindingResult.Success(inputValue.ToUpper());
                return Task.CompletedTask;
            }
        }
        bindingContext.Result = ModelBindingResult.Failed();
        return Task.CompletedTask;
    }
}

使用时给属性标记绑定器:

[ModelBinder(typeof(UpperCaseStringBinder))]
public string Name { get; set; }

也可以全局注册这个绑定器,让所有字符串属性自动转大写。

4. EF Core 值转换器(数据库层面处理)

如果希望不管通过什么方式操作数据,只要保存到数据库就自动转大写,用EF Core的ValueConverter最省心:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .Property(u => u.Name)
        .HasConversion(
            input => input.ToUpper(), // 写入数据库时转大写
            storedValue => storedValue // 读取时可按需处理,这里保持原样
        );
}

这种方式的优势是无需在业务代码里做任何处理,ORM层面自动完成转换。

5. API中间件(全局请求处理)

如果是Web API场景,想在请求到达控制器前就修改请求体中的字段,可以写个中间件:

public class UpperCaseNameMiddleware
{
    private readonly RequestDelegate _next;

    public UpperCaseNameMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        if (context.Request.Method == HttpMethods.Post && 
            context.Request.ContentType?.Contains("application/json") == true)
        {
            context.Request.EnableBuffering();
            using var reader = new StreamReader(context.Request.Body);
            var requestBody = await reader.ReadToEndAsync();
            
            // 解析并修改Name字段
            var jsonDoc = JsonDocument.Parse(requestBody);
            if (jsonDoc.RootElement.TryGetProperty("Name", out var nameElement) && 
                nameElement.ValueKind == JsonValueKind.String)
            {
                var updatedBody = requestBody.Replace(
                    $"\"Name\":\"{nameElement.GetString()}\"", 
                    $"\"Name\":\"{nameElement.GetString().ToUpper()}\""
                );
                var newStream = new MemoryStream(Encoding.UTF8.GetBytes(updatedBody));
                context.Request.Body = newStream;
                context.Request.Body.Position = 0;
            }
        }

        await _next(context);
    }
}

然后在Program.cs里注册中间件:

app.UseMiddleware<UpperCaseNameMiddleware>();

这些方案各有侧重,你可以根据自己的业务场景选择最适合的方式~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:35:14