Asp.net mvc 当用户未通过服务器验证时,如何在ASP.NET MVC的表单中保留输入的值?

Asp.net mvc 当用户未通过服务器验证时,如何在ASP.NET MVC的表单中保留输入的值?,asp.net-mvc,viewstate,Asp.net Mvc,Viewstate,我有一个ASP.NET MVC应用程序,它对用户友好,而且开箱即用的MVC不提供ViewState。我的问题是,如果用户未能通过服务器验证,那么我不希望他们必须再次输入所有值 如何在ASP.NET MVC中解决此问题 在web应用程序中不维护状态的所有麻烦是什么 这是一个复杂的领域。例如,使用会话管理状态的一个缺点是,如果它是RW会话,一次只能有一个线程与之交互。如果在同一个会话中有多个线程在运行(例如,并行执行来自同一页面的多个ajax调用),那么这将成为一个问题。启用会话意味着这些线程在与R

我有一个ASP.NET MVC应用程序,它对用户友好,而且开箱即用的MVC不提供ViewState。我的问题是,如果用户未能通过服务器验证,那么我不希望他们必须再次输入所有值

如何在ASP.NET MVC中解决此问题

在web应用程序中不维护状态的所有麻烦是什么

这是一个复杂的领域。例如,使用会话管理状态的一个缺点是,如果它是RW会话,一次只能有一个线程与之交互。如果在同一个会话中有多个线程在运行(例如,并行执行来自同一页面的多个ajax调用),那么这将成为一个问题。启用会话意味着这些线程在与RW会话交互时被阻塞,因此每个后续线程的执行时间越来越长

此外,对于具有容错能力的web应用程序,如果将多个节点用作服务器场,则必须使用共享会话状态备份提供程序(到SQL server或分布式缓存),以确保用户最终访问的服务器的状态看起来相同。这将导致性能损失

但老实说,如果用户未能通过服务器验证,那么我不希望 他们必须再次输入所有值

对于此问题,为了避免完全回发,并确保即使存在验证问题,也会保留用户在页面中输入的易失性数据,您应该尝试实现客户端验证。这不是我的专业领域,但你应该看看。 实现它需要一些工作,但出于性能和可用性的原因,它是值得的

一般来说,关于viewstate的优缺点,我认为传统智慧正在远离这一点的原因是(我相信您已经知道),viewstate有很多潜在的缺陷,包括可能不必要地从浏览器传输大型状态(以及必须在服务器端反序列化)并且还导致在客户端呈现不纯净的html。我认为MVC最好的地方是呈现的HTML的干净性

对于一个简单、单一、单一的web应用程序,它不必具有超级容错故障转移能力,我认为使用ASP.NET+Viewstate进行会话管理没有问题。这完全取决于你的网站需要实现什么。我相信其他人也会有他们的想法。希望这对你有用

但老实说,如果用户未能通过服务器验证,那么我不希望 他们必须再次输入所有值。我真的不明白 对于这个可用性问题,MVC解决方案是什么

这个模式其实很简单。您可以设计一个视图模型:

public class MyViewModel
{
    [Required]
    public string Foo { get; set; }
    public string Bar { get; set; }
    public int Baz { get; set; }
}
然后控制器:

public class HomeController: Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        if (!ModelState.IsValid)
        {
            // validation failed => redisplay the view so that
            // the user can fix his errors
            return View(model);
        }

        // TODO: A this stage the model passed validation =>
        // do some processing here and redirect

        return RedirectToAction("Success");
    }
}
最后是相应的观点:

@model MyViewModel

@Html.ValidationSummary(false)

@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(x => x.Foo)
        @Html.EditorFor(x => x.Foo)
    </div>
    <div>
        @Html.LabelFor(x => x.Bar)
        @Html.EditorFor(x => x.Bar)
    </div>
    <div>
        @Html.LabelFor(x => x.Baz)
        @Html.EditorFor(x => x.Baz)
    </div>

    <p><button type="submit">OK</button></p>
}
@model MyViewModel
@Html.ValidationSummary(false)
@使用(Html.BeginForm())
{
@LabelFor(x=>x.Foo)
@EditorFor(x=>x.Foo)
@LabelFor(x=>x.Bar)
@EditorFor(x=>x.Bar)
@LabelFor(x=>x.Baz)
@EditorFor(x=>x.Baz)
嗯

}

现在,当用户导航到
/home/index
时,会看到一张要填写的表单,在相应的输入字段中输入一些信息并提交表单。默认模型绑定器将根据相应POST操作中的请求值启动并绑定视图模型。如果验证失败,modelstate将被标记为无效,您现在可以重新显示相同的视图。由于所有信息都已发布在modelstate中,因此用于生成输入字段的HTML帮助程序将能够检索值并在回发阶段保留它们。

+1个有趣的问题。不应该闭嘴不让问题因为离题或不符合SO问题政策而闭嘴的方法就是不要问离题或不符合SO问题政策的问题,也不要在你的问题中抱怨。我把更具煽动性的部分拿出来,把你的问题提炼成肉。如果您想要讨论,您不希望堆栈溢出。为了保持问题的开放性,需要进行编辑。嗨,乔治,我读了你的评论,重新审视了我的答案,它似乎做了我想做的一切,但还没有关闭。谢谢:-)