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
相关产品推荐
相关产品推荐

