MVC 4自定义验证”;无法获取属性'addMethod'&”;
MVC 4 custom validation "Unable to get property 'addMethod'"
我正在尝试在MVC中实现自定义密码验证。我的服务器端验证工作得很好,但不知道目前如何注册客户端才能工作。
我得到一个错误:"中第6行第5列出现未处理的异常http://localhost:60215/Scripts/CustomPaswwordValidator.js
0x800a138f-JavaScript运行时错误:无法获取未定义或空引用""的属性"addMethod"
Webconfig:
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
型号:
[CustomPasswordValidator(FirstName = "FirstName", LastName = "LastName")]
public string Password { get; set; }
视图:
<div class="form-group">
@Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="control-label">
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
</div>
@Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
</div>
查看脚本加载:
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jquery.validate")
<script src="~/Scripts/MicrosoftMvcValidation.js"></script>
<script src="~/Scripts/CustomPaswwordValidator.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/jquery.validate-vsdoc.js"></script>
<script src="~/Scripts/jquery-1.4.4-vsdoc.js"></script>
<script src="~/Scripts/ jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.js" type="text/javascript"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js" type="text/javascript"></script>
<script src="~/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
自定义密码验证器.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace UserVerification.Models
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
using System.Web.Mvc;
namespace Custom_DataAnnotation_Attribute.Models
{
public class CustomPasswordValidator : ValidationAttribute, IClientValidatable
{
public string FirstName { get; set; }
public string LastName { get; set; }
public CustomPasswordValidator()
: base("Password client test")
{
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule();
rule.ErrorMessage = FormatErrorMessage("Password client test");
rule.ValidationParameters.Add("firstname", FirstName);
rule.ValidationParameters.Add("lastname", LastName);
rule.ValidationType = "passwordvalidation";
yield return rule;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
int requirmentsCount = 0;
string _LastName, _FirstName;
Object instance = validationContext.ObjectInstance;
Type type = instance.GetType();
Object proprtyvalue = type.GetProperty(FirstName).GetValue(instance, null);
_FirstName = proprtyvalue.ToString();
proprtyvalue = type.GetProperty(LastName).GetValue(instance, null);
_LastName = proprtyvalue.ToString();
if (value != null)
{
string password = value.ToString();
//CANNOT contain your first or last name
if (password.ToLower().Contains(_FirstName.ToLower()) || password.ToLower().Contains(_LastName.ToLower()))
{
return new ValidationResult("The password cannot contain your first or last name. Please try again.");
}
if (password.Length<8 || password.Length>30)
{
return new ValidationResult("Your password must be between 8 and 30 characters in length. Please try again.");
}
//English uppercase characters (A through Z)
if (password.Any(char.IsUpper))
{
requirmentsCount++;
}
//English lowercase characters (a through z)
if (password.Any(char.IsLower))
{
requirmentsCount++;
}
//Base 10 digits (0 through 9)
if (password.Any(char.IsDigit))
{
requirmentsCount++;
}
// Non-alphabetic characters: ~ ! @ # $ % ^ & * _ - + = ` | ' ( ) { } [ ] : ; " ' < > , . ? / SPACE
if (password.Any(char.IsPunctuation))
{
requirmentsCount++;
}
//if (Regex.IsMatch(password, @"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+'.[A-Za-z]{2,4}", RegexOptions.IgnoreCase))
//{
// return ValidationResult.Success;
//}
if (requirmentsCount>2)
{
return ValidationResult.Success;
}
else
{
return new ValidationResult("Your password does not contain at least 3 different types of characters. Please try again.");
}
}
else
{
return new ValidationResult("" + validationContext.DisplayName + " is required");
}
}
}
}}
CustomPasswordValidation.js(只是试图返回false,看看这是否有效):
/// <reference path="jquery-1.4.4-vsdoc.js" />
/// <reference path="jquery.validate-vsdoc.js" />
/// <reference path="jquery.validate.unobtrusive.js" />
jQuery.validator.addMethod("passwordvalidation", function (value, element, param) {
if (!value) return false;
var FirstName = param.firstName;
var LastName = param.lastName;
window.alert("sometext");
return false;
});
jQuery.validator.unobtrusive.adapters.add("passwordvalidation", ["firstName", "lastName"], function (options) {
var params = {
firstName: options.params.firstName,
lastName: options.params.lastName,
};
options.rules["passwordvalidation"] = params;
if (options.message) {
options.messages["passwordvalidation"] = options.message;
}
});
我很确定js部分出了问题,不确定为什么添加验证会如此复杂。
谢谢你的帮助!-Idan
我发现了这个问题,首先我导入了错误版本的Jquery文件,而且顺序似乎也很重要,不得不处理一下
相关文章:
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 全局变量和全局对象的属性之间有什么区别吗
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 序列化数据属性中对象的最可靠方法
- 分析高度属性时出现意外值{{specs.height}}.index.html
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- AngularJS-使用'true'属性
- 可以't使用JavaScript获取width属性
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- JavaScript Pub/Sub属性访问问题
- 从JavaScript访问struts操作中的属性
- 是否可以从父类访问子类的属性
- 如何更改reactjs中外部/独立组件的状态或属性
- 如何在选项卡上定义属性'的主窗口对象
- jQuery验证插件addMethod可以通过属性访问
- MVC 4自定义验证”;无法获取属性'addMethod'&”;
- 基于属性验证的jQueryValidate.addMethod