c# - 如何让 ModelState 使用 TempData 机制?
问题描述
据我所知,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
我不是 POST to 而是 POST 到类似的东西,然后如果模型中存在错误,/Update
则执行重定向返回到,这将停止工作。/Index
这是因为 ModelState 只持续当前的 HTTP 请求上下文,并且ValidationMessageFor
依赖 ModelState 来获取它的错误消息。当您重定向回 时/Index
,此状态将丢失。
这正是TempData
设计的目的,因为它会保持其会话状态,直到它在以后的 HTTP 请求中被读取。但是,ModelState 似乎没有使用这样的机制。
有没有办法让 ModelState 使用某种机制,TempData
这样如果我 POST 到不同的 URL 并重定向回无效的模型状态,我会正确地使用渲染到页面的错误消息ValidationMessageFor
(更一般地说,我保留 ModelState从我重定向之前的表单提交)?
解决方案
好的,所以基本上我发现我所描述的是 PRG 模型,它通常不用于 ASP.NET。您通常 POST 回相同的 URL,因此您拥有 POST 的 HTTP 上下文,并且仅在成功的情况下重定向,在这种情况下您不再需要 ModelState。不过,人们已经提出了在 ASP.NET 中实现 PRG 的解决方法,例如:
https ://andrewlock.net/post-redirect-get-using-tempdata-in-asp-net-core/
推荐阅读
- java - 在Java中设置JFrame内容后面的背景图片
- python - PySpark/Aws Glue 中的性能问题
- python - 如何在条件 f 字符串中应用浮点精度(类型说明符)?
- c# - 使用依赖注入 dotnet core 在应用启动时运行 Singleton 实例方法
- google-apps-script - 如何按 GAS 中应用的值对表格单元格进行排序?
- assembly - HLA 将 1 和 n 之间的所有数字相加
- html - 换个浏览器
- java - 可以在不调用构造函数的情况下创建一个类的实例进行测试吗?
- python - python中的模式匹配函数与答案评估系统相关吗?
- r - 无法使用 read.csv 函数读取 csv