我对ASP .Net MVC有疑问。 我的主页(工具栏)中有一个电子邮件注册表单,它有一个电子邮件的文本字段和一个将电子邮件发送到我的家庭控制器的按钮。
我遇到的问题是,如果我导航到不同控制器中的页面,然后单击“提交”以提交我的电子邮件,如果该电子邮件有错误,那么我向ModelState.Errors添加错误,然后重定向到原始页面(我的原始页面位于我的表单中的隐藏字段中,因此我知道重定向的位置),因为您可能已经注意到错误会丢失,因为在另一个控制器中我们有一个完全不同的ModelState。
如果没有错误,则会保存电子邮件并成功将用户发送到已完成的页面。
我首先想到我可以在TempData中保存错误,然后检查它是否在动作文件管理器或基本Controller类中的某处有值,并将其添加到新的Controller ModelState中。
我想知道是否有其他方式或更好的方法,或者即使在TempData中发送错误也是一种很好的做法。
感谢。
答案 0 :(得分:1)
POST动作的常用模式如下:
[HttpPost]
public ActionResult Foo(MyModel model)
{
if (!ModelState.IsValid)
{
// if there were some validation errors redisplay the form so that
// the user can fix them
return View(model);
}
// At this stage we know that the model is valid => we may try do some
// processing on it:
if (!Repository.TryDoSomeProcessing(model))
{
// Something wen wrong with our processing => redisplay the form
// to inform the user of this
ModelState.AddModelError("foo", "bar");
return View(model);
}
// at this stage we know that the processing succeeded => we may redirect
// there will no longer be error messages. We could at maximum use TempData
// to store some success message:
TempData["message"] = "Thank you for submitting!";
return RedirectToAction("Success");
}
当然,如果你违反了这种模式,并希望通过持续存在错误等方式进行重定向......那么你就是靠自己。我看到有人在使用TempData,Sessions,Cache等来解决重定向之间的持续错误。我更愿意在没有评论的情况下保留这些技巧。
答案 1 :(得分:0)
我使用TempData
在重定向之间保存ModelState
取得了巨大成功,绝对会推荐它!
MvcContrib项目有一个很好的帮助,可以使用Action过滤器轻松保存和恢复ModelState到TempData。
但是,对于我们的项目,我们需要手动控制,因此我们为TempData
创建了扩展方法,以便我们可以使用以下代码:
TempData.SaveModelState(ModelState);
return Redirect...;
要恢复:
TempData.RestoreModelState(ModelState);
这样,我们的网站永远不会从无效的POST呈现视图,它总是重定向到GET。