子表单上的MVC3验证

时间:2012-05-14 01:08:54

标签: asp.net-mvc asp.net-mvc-3 validation

我有一个页面,我想要一个项目列表(标题项目),其中包含一些详细信息和一个要查看的链接以及一个用于编辑它们的链接。此外,在列表的顶部,我想要一个表单来获取基本详细信息(开始和结束日期),并使用该数据创建一个新的标题项。

我做了什么:

  • 创建了一个标题控制器
  • 创建了一个索引视图(获取项目列表)
  • 创建了一个startHeader视图(包含一个带有开始,结束日期和按钮的表单,表单的actionName为“addHeader”)
  • 为开始日期和结束日期添加了“ValidationMessageFor”
  • 将startHeader视图添加为索引视图的部分视图

除了一些验证之外,一切似乎都有效。所需的字段验证似乎按预期工作(即如果您没有输入开始日期并单击按钮,则显示“需要开始日期”)。

但是我添加了一些似乎不起作用的额外验证:

  • 将IValidatableObject接口添加到标题类
  • 添加了验证码

    if(this.StartDate> this.EndDate)             {                 yield return new ValidationResult(“Start Date必须在结束日期之前。”,new [] {“StartDate”});             }

  • 按下按钮时,此代码按预期运行
  • 但是它不会停留在索引屏幕上并显示验证消息
  • 而不是它进入addHeader视图
  • 我原本预计这个工作与必要的字段验证相同,并显示验证消息

这里有什么我想念的吗?

  • 为什么此验证正在运行,但未显示错误消息?
  • 我是否需要添加一些内容才能让此验证运行并保留在页面上?
  • 有更好的做法吗?

1 个答案:

答案 0 :(得分:1)

可能是您的必填字段验证是通过Unobtrusive Client Validation显示的(您的模型可能包含数据注释[Required])。此验证通过JavaScript在客户端运行,因此根本不会回发到服务器。

相反,您编写的验证代码在表单回发到服务器后运行。您需要在addHeader()方法中捕获它。这些方面的东西:

[HttpPost]
public ActionResult addHeader(addHeader model)
{
    if (!ModelState.IsValid)
    {
        return View();
    }
    else
    {
        //Do Work to add your header...
        return View("Index");
    }
}

只要您的视图中有@Html.ValidationSummary(true),它就会自动显示ValidationResult。 See this for more details.