ASP.NET MVC验证和视图

时间:2008-11-26 11:57:06

标签: c# asp.net-mvc

我正在使用MVC验证页面上的某些html文本框,例如在我的控制器中有

        if (String.IsNullOrEmpty(name))
        {
            ModelState.AddModelError("name", "You must specify a name.");
        }


        if (ViewData.ModelState.IsValid)
        {
            return RedirectToAction("Index");
        }

返回View();

问题出在这里,如果验证失败,则返回View(“添加”)失败的原因是控制器不在返回视图()上处理视图,一个选项是使用RedirectToView(“viewname”);并且它会正常工作除了它没有通过验证AddModelError的东西(“就好像第一次加载页面一样”)。

我可以通过在返回View()之前重复填充SelectList框的代码来解决这个问题。

像这样

        ViewData["rooms"] = new SelectList(Villa.intList(10));
        ViewData["sleeps"] = new SelectList(Villa.intList(20));
        ViewData["accomodationType"] = new SelectList(accomodationList, "accomodationId", "accomodationType");
        ViewData["regionName"] = new SelectList(regionList, "regionId", "regionName");
        return View();

工作正常但是,我认为有一种更好的方法,而不是重复那段代码,是否有人知道任何返回重定向视图并传递模型错误的方法?

提前致谢,希望它有某种意义。

2 个答案:

答案 0 :(得分:4)

获取用于在(GET)Add操作中初始化ViewData的代码,并将其重构(提取方法)为独立的私有方法。从您的(GET)添加操作中调用该方法。现在在POST操作中(也就是我猜想,你在上面显示的内容;目前尚不清楚)你可以调用相同的私有方法来填充ViewData。现在您不再有任何重复的代码。请记住,ViewData是Controller类型的属性,因此您可以将其设置在任何位置,而不仅仅是在action方法本身。

答案 1 :(得分:0)

我必须承认,我对你的意思有些疑惑,所以这是一个通用的答案,可能不准确!

http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

这是一个很好的阅读。

我可以想到两种方式。

要更改最少量的代码,只需将ViewData放在TempData中,然后在重定向后检索它。

可能更接受的答案是使用上面链接中描述的方法。让您的表单回复相同的操作。该操作将有两个实现 - 一个Post和一个Get。在Post操作中,执行所有验证逻辑。如果验证有效,请对成功显示的任何视图执行重定向操作(Post-Redirect-Get模式)。如果验证失败,则重新显示表单的相同视图,并显示验证错误。

如果这不是你问的问题,那就知道〜