C# 如何让ModelState使用TempData机制?
据我所知,ASP.NET的ModelState机制有点问题。它只在当前HTTP请求的上下文中保留。假设我只想使用服务器端验证。我可以在我的C# 如何让ModelState使用TempData机制?,c#,asp.net,asp.net-mvc,http,session,C#,Asp.net,Asp.net Mvc,Http,Session,据我所知,ASP.NET的ModelState机制有点问题。它只在当前HTTP请求的上下文中保留。假设我只想使用服务器端验证。我可以在我的.cshtml视图中编写: @using (Html.BeginForm("Index", "MyController", routeValues: new { Area = "MyArea" }, method: FormMethod.Post, htmlAttributes: new { @autocomplete = "off" })) { @H
.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并重定向回无效的模型状态,我就可以使用ValidationMessageFor
(更一般地说,我在重定向之前保留表单提交中的ModelState)?好的,所以基本上我发现我所描述的是PRG模型,它在ASP.NET中通常不使用。您通常回发到同一个URL,因此您有发布的HTTP上下文,并且只有在成功的情况下才重定向,在这种情况下,您不再需要ModelState。人们已经想出了解决方法来解决我的问题但是,在ASP.NET中实现PRG,例如:这不是问题所在,
[必需]
正在工作。只是重定向时ModelState丢失了,所以没有显示错误。我的问题是,我的注释太快了。你能给我们看一下你在更新
中用于重定向到索引
的代码吗?不,但是你可以将ModelStateDictionary
添加到TempData
(虽然你的问题不清楚你想做什么或为什么)你如何在另一端设置它?Controller.ModelState
只有一个get
方法。或者你只是在检查它时不在控制器上设置它?你不在另一个控制器上设置它