ASP.NET MVC同控制器POST传参到GET时Model为Null如何解决?
问题原因
RedirectToAction本质是返回HTTP 302重定向响应,仅支持传递简单类型参数(字符串、数值等),直接传递复杂类对象时,ASP.NET MVC只会调用对象的ToString()方法传递类名,无法完成复杂类型的模型绑定,因此目标Action拿不到完整的Model属性。同时重定向会丢失当前请求的ModelState数据,你之前添加的错误提示也无法传递到视图。
最优解决方案
方案1:直接返回视图(推荐,保留错误信息)
不需要走重定向,直接在当前POST请求内返回目标视图,可完整保留Model和ModelState错误信息:
[HttpPost] public async Task<ActionResult> Create(Country _country) { var data = await checkduplicate(_country); if (!data.status) { ModelState.AddModelError("Name", data.ErrorMessage); // 直接返回Create视图,传递当前Model,无需跳转 return View("Create", _country); } else { return RedirectToAction("Index"); } }
该方案无需修改Edit方法,也不需要额外存储逻辑,性能最优,且用户可以看到你添加的重复校验错误提示。
方案2:使用TempData存储Model(适用于必须重定向的场景)
TempData是ASP.NET MVC提供的短生命周期存储容器,数据仅在一次后续请求中有效,刚好适配重定向场景:
步骤1:修改POST Create方法存储Model
[HttpPost] public async Task<ActionResult> Create(Country _country) { var data = await checkduplicate(_country); if (!data.status) { ModelState.AddModelError("Name", data.ErrorMessage); // 序列化复杂对象存储到TempData,避免类型转换问题 TempData["CountryData"] = System.Text.Json.JsonSerializer.Serialize(_country); return RedirectToAction("Edit"); } else { return RedirectToAction("Index"); } }
步骤2:修改Edit方法读取TempData
public async Task<ActionResult> Edit() { // 从TempData读取并反序列化Model var countryData = TempData["CountryData"]?.ToString(); Country _country = string.IsNullOrEmpty(countryData) ? new Country() : System.Text.Json.JsonSerializer.Deserialize<Country>(countryData); // 补充空值兜底逻辑,防止用户直接访问Edit路由 if(_country == null) return RedirectToAction("Create"); return View("Create", _country); }
额外注意事项
你定义的Model类名是小写country,后续参数使用的是大写Country,C#是大小写敏感语言,请统一类名大小写,避免模型绑定失败。
内容的提问来源于stack exchange,提问作者Sathishkumar
相关产品推荐
相关产品推荐

