我正在使用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();
工作正常但是,我认为有一种更好的方法,而不是重复那段代码,是否有人知道任何返回重定向视图并传递模型错误的方法?
提前致谢,希望它有某种意义。
答案 0 :(得分:4)
获取用于在(GET)Add操作中初始化ViewData的代码,并将其重构(提取方法)为独立的私有方法。从您的(GET)添加操作中调用该方法。现在在POST操作中(也就是我猜想,你在上面显示的内容;目前尚不清楚)你可以调用相同的私有方法来填充ViewData。现在您不再有任何重复的代码。请记住,ViewData是Controller类型的属性,因此您可以将其设置在任何位置,而不仅仅是在action方法本身。
答案 1 :(得分:0)
我必须承认,我对你的意思有些疑惑,所以这是一个通用的答案,可能不准确!
这是一个很好的阅读。
我可以想到两种方式。
要更改最少量的代码,只需将ViewData放在TempData中,然后在重定向后检索它。
可能更接受的答案是使用上面链接中描述的方法。让您的表单回复相同的操作。该操作将有两个实现 - 一个Post和一个Get。在Post操作中,执行所有验证逻辑。如果验证有效,请对成功显示的任何视图执行重定向操作(Post-Redirect-Get模式)。如果验证失败,则重新显示表单的相同视图,并显示验证错误。
如果这不是你问的问题,那就知道〜