当用户验证服务器失败时,如何在ASP.NET MVC中保留表单中输入的值?

时间:2012-02-24 11:44:58

标签: asp.net-mvc viewstate

我有一个ASP.NET MVC应用程序,用户友好,开箱即用MVC不提供ViewState。我的问题是,如果用户验证服务器验证失败,那么我不希望他们再次输入所有值。

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

2 个答案:

答案 0 :(得分:5)

  

但说实话,如果用户未通过服务器验证,那么我不想要   他们必须再次输入所有值。我真的不明白   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>
}

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

答案 1 :(得分:0)

  

关于不在Web应用程序中维护状态会有什么大惊小怪的呢?

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

此外,对于意图容错的Web应用程序,如果您将多个节点用作服务器场,则必须使用共享会话状态支持提供程序(到SQL服务器或分布式缓存)以确保其中的任何一个服务器用户最终命中它们看起来是相同的状态。这会带来性能损失。

  

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

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

关于一般观点的优点/缺点,我认为传统智慧远离这一点的原因是(因为我相信你已经知道),观点状态带来了许多潜在的陷阱,包括潜在的不必要的大状态被转移到浏览器和从浏览器转移(并且必须在服务器端反序列化)并且还导致在客户端呈现不纯的 html。恕我直言,关于MVC的最好的事情是呈现的HTML的清晰度。

对于一个简单,单一,单片的Web应用程序,它不必具有超级故障转移容限,我没有看到使用ASP.NET + Viewstate进行会话管理的问题。这完全取决于您的网站需要实现的目标。我相信别人会有他们的想法。希望这对你有用!