2008-11-26 60 views
4

我使用MVC来验证一些HTML文本框的网页上,例如在我的控制器有ASP.NET MVC的验证和意见

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


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

返回查看();

问题在这里,如果验证失败,它返回视图失败(“添加”)原因控制器不处理返回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(); 

工作正常,但是,我认为这是一个更好的办法,而不是重复的代码块,没有人知道返回重定向视图,并传递给它的模型误差的任何方式?

在此先感谢,希望它能提供某种意义。

回答

4

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

+0

尚未测试,但它是有道理的,不知道你可以做一个ActionResult方法之外!谢谢 – Tablet 2008-11-26 15:14:39

0

我必须承认,我完全明白你的意思有些困惑,所以这是一种可能不准确的通用答案!

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

这是一个良好的阅读。

我可以想到两种方法。

要更改最少量的代码,只需将您的ViewData放入TempData并在重定向检索后即可。

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

如果这不是你问什么,还是让我知道了〜