ASP.NET Core表单提交报错:PostFou与视图要求的JobAddressVM类型不匹配
错误原因
- 视图明确声明了
@model AURA.ViewModels.JobAddressVM,要求接收的模型必须是JobAddressVM类型,但HttpPost的JobAddress方法中,当ModelState.IsValid == false验证失败时,返回视图时传入了postFou(AURA.Models.PostFou类型),两种类型不匹配,直接触发类型转换异常。 - 目前Post方法的参数绑定逻辑完全没有用到自定义的JobAddressVM,你写的ViewModel验证规则、字段配置完全未生效,表单提交的字段被ASP.NET Core模型绑定器自动映射到了PostZero、PostOne、PostFou三个实体的同名字段上,这也是你没找到显式引用PostFou但它被实例化传入的原因。
修复方案
- 修改HttpPost方法的参数,直接接收JobAddressVM类型的模型,替换原有三个实体参数,让自定义验证规则生效:
[HttpPost] public async Task<IActionResult> JobAddress(JobAddressVM model) { if (ModelState.IsValid) { // 手动把VM字段赋值到三个业务实体 PostZero postZero = new PostZero() { FouName = model.FouName, FouPhon = model.FouPhon, FouEmai = model.FouEmai, FouAddr = model.FouAddr, FouPost = model.FouPost, FouOrg = model.FouOrg, ZeroDate = DateTime.Now }; string uDate = DateTime.Now.ToString("yyMMdd"); string uDigit = _context.PostZeros.Count(d => d.ZeroDate.Date == postZero.ZeroDate.Date).ToString(); postZero.Zero = uDate + "-" + uDigit; postZero.ZeroAgen = User.Identity.Name; _context.Add(postZero); await _context.SaveChangesAsync(); PostOne postOne = new PostOne() { OneStag = "MSR", OneZero = postZero.Zero, OneAgen = User.Identity.Name, OnePart = model.FouPhon, OneTitl = "T--" + model.FouName + "--" + DateTime.Now.ToShortDateString(), OneType = "MSR" }; _context.Add(postOne); await _context.SaveChangesAsync(); PostEig postEig = new PostEig() { EigZero = postZero.Zero, EigAgen = "CLIENT", EigRole = "SALE", EigLoad = 0 }; _context.Add(postEig); await _context.SaveChangesAsync(); PostFou postFou = new PostFou() { FouZero = postZero.Zero, FouName = model.FouName, FouPhon = model.FouPhon, FouEmai = model.FouEmai, FouAddr = model.FouAddr, FouPost = model.FouPost, FouOrg = model.FouOrg }; _context.Add(postFou); await _context.SaveChangesAsync(); return RedirectToAction(nameof(PriceShip), new { zero = postOne.OneZero }); } // 验证失败时直接返回JobAddressVM类型的model,和视图要求的类型匹配 return View(model); }
- 可选优化:Get请求方法主动传入空的ViewModel实例,避免潜在的空引用问题:
public IActionResult JobAddress() { return View(new JobAddressVM()); }
内容的提问来源于stack exchange,提问作者Nick Fleetwood
相关产品推荐
相关产品推荐

