如何解决验证错误后为RedirectToAction
| 如果我有通常的“编辑”操作,请执行GET操作以通过其ID检索对象并将其显示在编辑表单中。 POST的下一个功能是获取ViewModel中的值并更新数据库中的对象。public virtual ActionResult Edit(int id)
[HttpPost]
public ActionResult Edit(VehicleVariantEditSaveViewModel viewModel)
如果在POST操作中的模型绑定期间发生错误,我知道我可以将RedirectToAction返回到GET操作,并通过将其复制到TempData并在GET操作中进行重定向后进行检索来保留ModelState验证错误。
if (TempData[\"ViewData\"] != null)
{
ViewData = (ViewDataDictionary)TempData[\"ViewData\"];
}
然后,我如何将包含先前无效ModelState的ViewData转换为新模型以发送到视图,以便用户看到带有验证警告的无效输入?奇怪的是,如果我将从数据库中检索到的ViewModel的新实例(带有原始有效数据)传递给View(),它将被忽略,并显示ViewData中的(无效)数据!
谢谢
解决方法
我遇到了类似的问题,因此决定使用以下模式:
public ActionResult PersonalRecord(Guid id)
{
if (TempData[\"Model\"] == null)
{
var personalRecord = _context.PersonalRecords.Single(p => p.UserId == id);
var model = personalRecord.ToPersonalRecordModel();
return View(model);
}
else
{
ViewData = (ViewDataDictionary) TempData[\"ViewData\"];
return View(TempData[\"Model\"]);
}
}
[HttpPost]
public ActionResult PersonalRecord(PersonalRecordModel model)
{
try
{
if (ModelState.IsValid)
{
var personalRecord = _context.PersonalRecords.Single(u => u.UserId == model.UserId);
personalRecord.Email = model.Email;
personalRecord.DOB = model.DOB;
personalRecord.PrimaryPhone = model.PrimaryPhone;
_context.Update(personalRecord);
_context.SaveChanges();
return RedirectToAction(\"PersonalRecord\");
}
}
catch (DbEntityValidationException ex)
{
var errors = ex.EntityValidationErrors.First();
foreach (var propertyError in errors.ValidationErrors)
{
ModelState.AddModelError(propertyError.PropertyName,propertyError.ErrorMessage);
}
}
TempData[\"Model\"] = model;
TempData[\"ViewData\"] = ViewData;
return RedirectToAction(\"PersonalRecord\",new { id = model.UserId });
}
希望这可以帮助。
,我注意到该模型包含在ViewData中,因此除了ViewData之外您不需要传递它,我不了解的是如何获得它然后将其返回到视图。
public ViewResult Edit(int id)
{
// Check if we have ViewData in the session from a previous attempt which failed validation
if (TempData[\"ViewData\"] != null)
{
ViewData = (ViewDataDictionary)TempData[\"ViewData\"];
}
VehicleVariantEditViewModel viewModel = new VehicleVariantControllerViewModelBuilder()
.BuildForEdit(id);
return View(viewModel);
}
上面的方法有效,但是显然它对数据库进行了不必要的调用以构建新的模型(该模型自动被传递的ViewData中的模型中的无效值覆盖)
令人困惑。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。