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

ASP.NET MVC中创建失败时如何将Create动作的ViewModel传递至Edit视图

解决方案:创建失败时传递已填写的ViewModel到Edit页面

在ASP.NET MVC场景下,要实现创建失败时保留用户已输入的数据并传递到Edit页面,让用户无需重新填写所有内容,这里有几种实用的落地方法,结合你的代码给出具体实现:

方法1:使用TempData传递ViewModel(推荐,适配一次性跨Action传值场景)

TempData是ASP.NET MVC专门设计用于Action间临时存储数据的容器,数据会在下次请求后自动清除,非常适合这种跳转后仅需用一次的传值需求。

第一步:修改Create动作

将用户提交的PlayerSettingViewModel存入TempData,再跳转到Edit页面:

public ActionResult Create(PlayerSettingViewModel view) //Action 
{ 
    // 这里替换成你实际的创建逻辑判断
    if (view.Id > 0) // 注意原代码里的`model.id`应该是笔误,改成view.Id
    { 
        return RedirectToAction("Index", "Player");//创建成功时跳转
    }else 
    { 
        // 把用户已输入的ViewModel存入TempData
        TempData["PlayerSettingViewModel"] = view;
        // 同时传递验证错误(如果有ModelState校验失败的情况)
        TempData["ModelStateErrors"] = ModelState;
        return RedirectToAction("Edit", "Player");
    } 
} 

第二步:修改Edit动作

在Edit动作中优先检查TempData里是否有传递过来的ViewModel,如果有就直接使用,否则再走原有的数据库查询逻辑:

[HttpGet] 
public ActionResult Edit(int? id) //View 
{ 
    PlayerSettingViewModel view;

    // 先判断是否有从Create传递过来的ViewModel
    if (TempData["PlayerSettingViewModel"] is PlayerSettingViewModel tempViewModel)
    {
        view = tempViewModel;
        // 还原ModelState错误,让页面显示原来的校验提示
        if (TempData["ModelStateErrors"] is ModelStateDictionary tempModelState)
        {
            foreach (var key in tempModelState.Keys)
            {
                foreach (var error in tempModelState[key].Errors)
                {
                    ModelState.AddModelError(key, error.ErrorMessage);
                }
            }
        }
    }
    else
    {
        // 原有的数据库查询逻辑
        view = new PlayerSettingViewModel(); 
        if (id != null) 
        { 
            AccountDTO model = _AccountsBLL.GetAccountById(id.Value); 
            if (model != null) 
            { 
                if (model.AccountId != null) 
                { 
                    AccountDTO Account = _AccountsBLL.GetAccount(model.AccountId); 
                    view = new PlayerSettingViewModel 
                    { 
                        Id = Account.Id, 
                        AccountType = Account.AccountType,
                        Username = Account.Username , 
                        Password = Account.Password , 
                    }; 
                } 
            } 
        } 
    }

    return View(view); 
} 

方法2:使用Session(不推荐,仅适用于需要长期保留数据的场景)

如果需要数据在多次请求中保留,可以用Session,但用完记得主动清除,避免占用服务器资源:

// Create动作中存入Session
Session["PlayerSettingViewModel"] = view;
return RedirectToAction("Edit", "Player");

// Edit动作中读取并清除Session
if (Session["PlayerSettingViewModel"] is PlayerSettingViewModel tempViewModel)
{
    view = tempViewModel;
    Session.Remove("PlayerSettingViewModel"); // 用完及时清除
}

注意事项

  • 确保PlayerSettingViewModel是可序列化的普通POCO类(无复杂嵌套或未序列化的对象),否则TempData或Session可能无法正常存储。
  • 原Create动作中的model.id属于笔误,建议修正为view.Id,否则判断逻辑会失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:22:41