保存至数据库前修改用户输入:自动转换姓名为大写
好问题!除了你当前用的模型属性封装方法,还有几种实用的实现方式,我给你梳理一下:
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
相关产品推荐
相关产品推荐

