Asp.net mvc 当用户未通过服务器验证时,如何在ASP.NET MVC的表单中保留输入的值?
我有一个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解决方案是什么 这个模式其实很简单。您可以设计一个视图模型: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
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问题政策的问题,也不要在你的问题中抱怨。我把更具煽动性的部分拿出来,把你的问题提炼成肉。如果您想要讨论,您不希望堆栈溢出。为了保持问题的开放性,需要进行编辑。嗨,乔治,我读了你的评论,重新审视了我的答案,它似乎做了我想做的一切,但还没有关闭。谢谢:-)