据我所知,ASP.NET的ModelState机制存在一些问题。它仅在当前HTTP请求的上下文中保留。假设我只想使用服务器端验证。我可以在.cshtml
视图中写这个:
@using (Html.BeginForm("Index", "MyController", routeValues: new { Area = "MyArea" }, method: FormMethod.Post, htmlAttributes: new { @autocomplete = "off" }))
{
@Html.TextBoxFor(m => m.SomeTextbox, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.SomeTextbox)
...
...我的模型在哪里
public class SomeModel
{
[Display(Name = "Some Textbox")]
[Required]
public string SomeTextbox { get; set; }
如果我现在在我的操作方法中检查模型状态的有效性,当我提交不包含任何内容的表单时,ValidationMessageFor
帮助者会正确显示验证消息(“基本文本框为必填字段”。)文本框:
public class MyController : Controller
{
[HttpGet]
public ActionResult Index()
{
return View(new SomeModel());
}
[HttpPost]
public ActionResult Index(SomeModel model)
{
if (!ModelState.IsValid)
{
// Server-side model validation failed; abort!
return View(model);
}
...
但是,如果模型中存在错误,而不是发布到/Index
之类的东西,而不是发布到/Update
之类的东西,然后重定向回/Index
,这将停止工作。这是因为ModelState仅在当前HTTP请求上下文中有效,并且ValidationMessageFor
依赖ModelState来获取其错误消息。当您重定向回到/Index
时,此状态会丢失。
这正是TempData
旨在解决的问题,因为它保持会话状态,直到在以后的HTTP请求中读取它为止。但是,ModelState似乎没有使用这种机制。
是否可以让ModelState使用TempData
之类的机制,以便如果我发布到其他URL并重定向回无效的模型状态,则可以正确地使用{{ 1}}(通常,在重定向之前,我保留了表单提交中的ModelState)?
答案 0 :(得分:0)
好的,所以基本上我发现我所描述的是PRG模型,它在ASP.NET中通常不使用。通常,您将POST返回到相同的URL,因此具有在其中进行POST的HTTP上下文,并且仅在成功的情况下重定向,在这种情况下,您不再需要ModelState。人们已经提出了解决方法,以在ASP.NET中实现PRG,例如:
https://andrewlock.net/post-redirect-get-using-tempdata-in-asp-net-core/