C# 如何让ModelState使用TempData机制?

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

据我所知,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并重定向回无效的模型状态,我就可以使用
ValidationMessageFor
(更一般地说,我在重定向之前保留表单提交中的ModelState)?

好的,所以基本上我发现我所描述的是PRG模型,它在ASP.NET中通常不使用。您通常回发到同一个URL,因此您有发布的HTTP上下文,并且只有在成功的情况下才重定向,在这种情况下,您不再需要ModelState。人们已经想出了解决方法来解决我的问题但是,在ASP.NET中实现PRG,例如:

这不是问题所在,
[必需]
正在工作。只是重定向时ModelState丢失了,所以没有显示错误。我的问题是,我的注释太快了。你能给我们看一下你在
更新
中用于重定向到
索引
的代码吗?不,但是你可以将
ModelStateDictionary
添加到
TempData
(虽然你的问题不清楚你想做什么或为什么)你如何在另一端设置它?
Controller.ModelState
只有一个
get
方法。或者你只是在检查它时不在控制器上设置它?你不在另一个控制器上设置它