Razor 为什么我在提交表单之前看到验证消息

Razor 为什么我在提交表单之前看到验证消息,razor,asp.net-mvc-4,jquery-validate,unobtrusive-validation,Razor,Asp.net Mvc 4,Jquery Validate,Unobtrusive Validation,我已经创建了一个表单,当我加载带有它的页面时,我会在提交表单之前看到验证消息。为什么?你可以 而项是局部视图: @model MyMustAgreeValidation.Models.LabelEditorValidation <div class="editor-label"> @Model.Label </div> <div class="editor-field"> @Model.Editor @Model.Validation

我已经创建了一个表单,当我加载带有它的页面时,我会在提交表单之前看到验证消息。为什么?你可以

是局部视图:

@model MyMustAgreeValidation.Models.LabelEditorValidation
<div class="editor-label">
    @Model.Label
</div>
<div class="editor-field">
    @Model.Editor
    @Model.Validation
</div>
脚本包括:

 <script src="/Scripts/jquery-1.7.1.js"></script>        
 <script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
 <script src="/Scripts/jquery.validate.js"></script>
 <script src="/Scripts/jquery.validate.unobtrusive.js"></script>
 <script src="/Scripts/Validation/EqualAttribute.js"></script>
EqualAttribute.js:

jQuery.validator.addMethod("equal", function (value, element, param) {
    if($(element).attr("type")=="checkbox")
    {
        value = String($(element).attr("checked"));
        param = param.toLowerCase();
    }
    return (value == param);
});

jQuery.validator.unobtrusive.adapters.addSingleVal("equal", "valuetocompare");

您是否在页面中包含了正确的validation.js文件?谢谢您的编辑。另一个“扔到墙上”,看看会发生什么想法:是否有任何自定义javascript会干扰输入,从而自动触发验证?非常好的代码。如果不使用自定义助手,是否存在问题?这应该是一个简单的测试。@TreyGramann在没有助手的情况下尝试:
@Html.LabelFor(m=>m.Password)@Html.EditorFor(m=>m.Password)@Html.ValidationMessageFor(m=>m.Password)
。相同的result@da7rutrak尝试禁用自定义非侵入性验证删除
。同样的结果
public class LabelEditorValidation
{
    public MvcHtmlString Label { get; set; }
    public MvcHtmlString Editor { get; set; }
    public MvcHtmlString Validation { get; set; }
}
 <script src="/Scripts/jquery-1.7.1.js"></script>        
 <script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
 <script src="/Scripts/jquery.validate.js"></script>
 <script src="/Scripts/jquery.validate.unobtrusive.js"></script>
 <script src="/Scripts/Validation/EqualAttribute.js"></script>
 public class NewUserProfileModel : UserProfileModel, IValidatableObject
{
    [Display(Name="Password", ResourceType = typeof(NewUserProfileRes))]
    [DataType(DataType.Password)]
    [Required(ErrorMessageResourceName = "FieldIsRequired", ErrorMessageResourceType = typeof(ErrorsRes))]
    [StringLengthRange(6, 64, ErrorMessageResourceType = typeof(ErrorsRes), ErrorMessageResourceName = "InvalidStringLength")]
    public string Password { get; set; }


    [Display(Name="ConfirmPassword", ResourceType = typeof(NewUserProfileRes))]
    [DataType(DataType.Password)]
    [Compare("Password", ErrorMessageResourceType = typeof(NewUserProfileRes), ErrorMessageResourceName = "PasswordsDontMatch")]
    public string ConfirmPassword { get; set; }

    [Display(Name="AgreementAccepted", ResourceType = typeof(NewUserProfileRes))]
    [Equal(true, ErrorMessageResourceType = typeof(NewUserProfileRes), ErrorMessageResourceName = "MustAgreeWithEULA")]
    public bool AgreementAccepted { get; set; }

    public NewUserProfileModel()
    {
        var property = GetType().GetProperty("Login");
        var list = property.GetCustomAttributes(true);
        foreach (var item in list)
        {
            Console.WriteLine(item);
        }
    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var userRepository = new UserRepository();
        if (userRepository.IsLoginExists(Login))
        {
            yield return new ValidationResult(NewUserProfileRes.LoginAlreadyExists, new []{"Login"});
        }
    }
 public class UserProfileModel
{
    [Display(Name = "Login", ResourceType = typeof(UserProfileRes))]
    [DataType(DataType.Text)]
    [Required(ErrorMessageResourceName = "FieldIsRequired", ErrorMessageResourceType = typeof(ErrorsRes))]
    [StringLengthRange(3, 64, ErrorMessageResourceName = "InvalidStringLength", ErrorMessageResourceType = typeof(ErrorsRes))]
    public string Login { get; set; }


    [Display(Name="DisplayName", ResourceType = typeof(UserProfileRes))]
    [DataType(DataType.Text)]
    [Required(ErrorMessageResourceName = "FieldIsRequired",
        ErrorMessageResourceType = typeof(ErrorsRes))]
    [StringLengthRange(3, 32, 
        ErrorMessageResourceName = "InvalidStringLength",
        ErrorMessageResourceType = typeof(ErrorsRes))]
    public string DisplayName { get; set; }


    [Display(Name = "Email", ResourceType = typeof(UserProfileRes))]
    [DataType(DataType.EmailAddress)]
    [Required(ErrorMessageResourceType = typeof(ErrorsRes), ErrorMessageResourceName = "FieldIsRequired")]
    [RegularExpression(@"[\w\.-]*[a-zA-Z0-9_]@[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]", ErrorMessageResourceType = typeof(ErrorsRes), ErrorMessageResourceName = "InvalidEmailAddress")]
    [StringLength(64, ErrorMessageResourceType = typeof(ErrorsRes), ErrorMessageResourceName = "StringTooLong")]
    public string Email { get; set; }

    [Display(Name="Homepage", ResourceType = typeof(UserProfileRes))]
    [DataType(DataType.Url)]
    [RegularExpression(@"(http(s)?://)?([\w-]+\.)+[\w-]+(/[\w- ;,./?%&=]*)?", ErrorMessageResourceType = typeof(ErrorsRes), ErrorMessageResourceName = "IvalidUrl")]
    [StringLength(96,
        ErrorMessageResourceType = typeof(ErrorsRes), ErrorMessageResourceName = "StringTooLong")]
    public string Homepage { get; set; }
}
jQuery.validator.addMethod("equal", function (value, element, param) {
    if($(element).attr("type")=="checkbox")
    {
        value = String($(element).attr("checked"));
        param = param.toLowerCase();
    }
    return (value == param);
});

jQuery.validator.unobtrusive.adapters.addSingleVal("equal", "valuetocompare");