Asp.net mvc 3 MVC3自定义服务器端数据批注验证在局部视图中不起作用

Asp.net mvc 3 MVC3自定义服务器端数据批注验证在局部视图中不起作用,asp.net-mvc-3,data-annotations,partial-views,custom-attributes,Asp.net Mvc 3,Data Annotations,Partial Views,Custom Attributes,我试图通过数据注释添加自定义数据验证。我现在只关心服务器端验证。我在这里和其他地方看到的一切都涉及客户端验证。我已经精简了所有代码,运行了一些测试用例,我可以在常规视图中正常工作,但是一旦表单在局部视图中,代码就不再在覆盖IsValid的方法中中断 在这两种情况下,我都可以看到自定义属性正在初始化。当表单在常规视图中时,我可以看到在提交表单时执行的覆盖方法,但是在部分视图中,代码永远不会执行,它直接进入HttpPost操作 我花了两天的大部分时间试图弄明白这一点,但我不知所措。任何帮助都将不胜感

我试图通过数据注释添加自定义数据验证。我现在只关心服务器端验证。我在这里和其他地方看到的一切都涉及客户端验证。我已经精简了所有代码,运行了一些测试用例,我可以在常规视图中正常工作,但是一旦表单在局部视图中,代码就不再在覆盖IsValid的方法中中断

在这两种情况下,我都可以看到自定义属性正在初始化。当表单在常规视图中时,我可以看到在提交表单时执行的覆盖方法,但是在部分视图中,代码永远不会执行,它直接进入HttpPost操作

我花了两天的大部分时间试图弄明白这一点,但我不知所措。任何帮助都将不胜感激

注: 下面的代码在进入HttpPost操作时返回相同的视图。我有这样的测试目的。我知道我的覆盖永远不会从局部视图中被调用,因此IsValid总是正确的

显示验证工作所在表单的视图

@model eRecruitBoard.ViewModels.HomeIndexViewModel
@{
    ViewBag.Title = "eRecruitBoard";
}
@*<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>*@

<h2>Login/homepage</h2>

<br /><br />
 <div class="errorMessage">
 @Html.DisplayFor(m => m.LoginErrorMsg)
</div>
<br />

@using (Html.BeginForm("Index", "Home")) {
    <div id="loginControlBox">
        <fieldset>
            <legend>Welcome to eRecruitBoard</legend> 

            <div class="editor-label">
                @Html.LabelFor(m => m.UserName)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.UserName)
                @Html.ValidationMessageFor(m => m.UserName)
            </div>

            <div class="editor-label">
                @Html.LabelFor(m => m.Password)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(m => m.Password)
                @Html.ValidationMessageFor(m => m.Password)
            </div>

            <div class="editor-label">
                @Html.CheckBoxFor(m => m.RememberMe)
                @Html.LabelFor(m => m.RememberMe)
            </div>
            <div class="editor-label">
                @Html.EditorFor(m => m.Date)
                @Html.ValidationMessageFor(m => m.Date)
            </div>
            <p>
                <input type="submit" value="Log In" />
            </p>
        </fieldset>
    </div>
}
    <div>
        @Html.Action("BlankForm", "TestForm")
    </div>
控制器(用于局部视图)

验证码

using System;
using System.ComponentModel.DataAnnotations;

namespace eRecruitBoard.WebLibrary.Validation
{
    [AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
    public class NonFutureDateAttribute : ValidationAttribute  //public sealed class 
    {
        public NonFutureDateAttribute(): base("Activity can only be saved for today or dates in the past.")
        {
        }
        public override bool IsValid(object value)
        {
            DateTime dateToCheck = (DateTime)value;
            return (dateToCheck <= DateTime.Today);
        }
    }
}
使用系统;
使用System.ComponentModel.DataAnnotations;
命名空间eRecruitBoard.WebLibrary.Validation
{
[AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter,AllowMultiple=false,Inherited=true)]
公共类非未来日期属性:ValidationAttribute//公共密封类
{
public nonfuturedataAttribute():base(“只能为今天或过去的日期保存活动”)
{
}
公共覆盖布尔值有效(对象值)
{
DateTime dateToCheck=(DateTime)值;

return(dateToCheck如果
RedirectToAction
您将丢失所有验证。您必须
在POST操作中返回PartialView(model)
。这需要将
NewActivity2
的参数类型更改为
TestFormViewModel

如果部分视图仍然不起作用,请使用如何显示该视图的示例(
@Html.partial()
或javascript)更新代码

namespace eRecruitBoard.ViewModels
{
    public class TestFormViewModel
    {
        [Required]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
        [NonFutureDate()]
        [Display(Name = "Date")]
        public DateTime Date { get; set; }
    }
}
namespace eRecruitBoard.Controllers
{
    public class TestFormController :BaseController
    {
        public ActionResult BlankForm()
        {
            var viewModel = new TestFormViewModel
            {
                Date = DateTime.Today
            };

            return PartialView("_TestForm", viewModel);
        }

        [HttpPost]
        public ActionResult NewActivity2(DateTime Date)
        {
            if (!ModelState.IsValid)
                return RedirectToAction("Index", "Home");
            else
                return RedirectToAction("Index", "Home");
        }
    }
}
using System;
using System.ComponentModel.DataAnnotations;

namespace eRecruitBoard.WebLibrary.Validation
{
    [AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
    public class NonFutureDateAttribute : ValidationAttribute  //public sealed class 
    {
        public NonFutureDateAttribute(): base("Activity can only be saved for today or dates in the past.")
        {
        }
        public override bool IsValid(object value)
        {
            DateTime dateToCheck = (DateTime)value;
            return (dateToCheck <= DateTime.Today);
        }
    }
}