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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:33:03