【发布时间】:2014-11-26 00:22:30
【问题描述】:
我已经按照不同的示例提出了一个自定义验证器来检查电话号码。我的号码将进入三个不同的领域。我只是想确保如果提供了电话号码,那么所有三个字段都应该有一些东西。当我单击提交按钮时,我得到了我已应用此属性的字段的值。 Now for the other two fields, i am getting the wrong id and due to this, the value is undefined as showing in this image。我在这里做错了什么?我不想将电话字段移出学生班级并进入视图模型。
看起来我的问题是我如何指定其他属性
[PhoneCodePrefixNumber(FieldOne = "HomePhoneAreaCode", FieldTwo = "HomePhonePrefix", ErrorMessage = "You must enter all three parts of the phone number.")]
如果我根据我的结构(Student_HomePhoneAreaCode 和 Student_HomePhonePrefix)在此处更改 id,则属性代码将引发错误,因为 id 错误,此行返回 null
var baseFieldOneInfo = validationContext.ObjectType.GetProperty(FieldOne);.
页面上显示的 id 是,视图模型将学生类作为属性:
- Student_HomePhoneAreaCode
- Student_HomePhonePrefix
- Student_HomePhoneLastFour
这是页面中的 html。如果您查看第三个输入,这里的 ID 对于我的其他两个字段 data-val-phonecodeprefixnumber-fieldone="HomePhoneAreaCode" data-val-phonecodeprefixnumber-fieldtwo="HomePhonePrefix" 是错误的。
<input class="autoTabElement" data-val="true" data-val-digits="Please input only numbers for area code." data-val-length="Please input 3 numbers for the area code." data-val-length-max="3" data-val-length-min="3" id="Student_HomePhoneAreaCode" maxlength="3" name="Student.HomePhoneAreaCode" style="width:26px;" type="text" value="816" />
<input class="autoTabElement" data-val="true" data-val-digits="Please input only numbers for phone prefix." data-val-length="Please input 3 numbers for the phone prefix." data-val-length-max="3" data-val-length-min="3" id="Student_HomePhonePrefix" maxlength="3" name="Student.HomePhonePrefix" style="width:26px;" type="text" value="525" />
<input class="autoTabElement" data-val="true" data-val-digits="Please input only numbers for phone number." data-val-length="Please input 4 numbers for the phone number." data-val-length-max="4" data-val-length-min="4" data-val-phonecodeprefixnumber="You must enter all three parts of the phone number." data-val-phonecodeprefixnumber-fieldone="HomePhoneAreaCode" data-val-phonecodeprefixnumber-fieldtwo="HomePhonePrefix" id="Student_HomePhoneLastFour" maxlength="4" name="Student.HomePhoneLastFour" style="width:32px;" type="text" value="2201" />
<br /><span class="field-validation-valid" data-valmsg-for="Student.HomePhoneAreaCode" data-valmsg-replace="true"></span>
<span class="field-validation-valid" data-valmsg-for="Student.HomePhonePrefix" data-valmsg-replace="true"></span>
<span class="field-validation-valid" data-valmsg-for="Student.HomePhoneLastFour" data-valmsg-replace="true"></span>
这里是 Student 类的属性。请注意,Student 类已添加到视图模型中。
[Digits(ErrorMessage = "Please input only numbers for area code.")]
[StringLength(3, MinimumLength = 3, ErrorMessage = "Please input 3 numbers for the area code.")]
public string HomePhoneAreaCode { get; set; }
[Digits(ErrorMessage = "Please input only numbers for phone prefix.")]
[StringLength(3, MinimumLength = 3, ErrorMessage = "Please input 3 numbers for the phone prefix.")]
public string HomePhonePrefix { get; set; }
[Digits(ErrorMessage = "Please input only numbers for phone number.")]
[StringLength(4, MinimumLength = 4, ErrorMessage = "Please input 4 numbers for the phone number.")]
[PhoneCodePrefixNumber(FieldOne = "HomePhoneAreaCode", FieldTwo = "HomePhonePrefix", ErrorMessage = "You must enter all three parts of the phone number.")]
public string HomePhoneLastFour { get; set; }
这是属性代码
public sealed class PhoneCodePrefixNumberAttribute : ValidationAttribute, IClientValidatable
{
public string FieldOne { get; set; }
public string FieldTwo { get; set; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var valThis = (IComparable)value;
var baseFieldOneInfo = validationContext.ObjectType.GetProperty(FieldOne);
var valFieldOne = (IComparable)baseFieldOneInfo.GetValue(validationContext.ObjectInstance, null);
var baseFieldTwoInfo = validationContext.ObjectType.GetProperty(FieldOne);
var valFieldTwo = (IComparable)baseFieldTwoInfo.GetValue(validationContext.ObjectInstance, null);
ValidationResult result = null;
if (valThis != null || valFieldOne != null || valFieldTwo != null)
{
if (
(valThis != null && (valFieldOne == null || valFieldTwo == null)) ||
(valFieldOne != null && (valThis == null || valFieldTwo == null)) ||
(valFieldTwo != null && (valThis == null || valFieldOne == null))
)
{
result = new ValidationResult(base.ErrorMessage);
}
}
return result;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,
ControllerContext context)
{
var errorMessage = this.FormatErrorMessage(metadata.DisplayName);
var compareRule = new ModelClientValidationRule();
compareRule.ErrorMessage = errorMessage;
compareRule.ValidationType = "phonecodeprefixnumber";
compareRule.ValidationParameters.Add("fieldone", FieldOne);
compareRule.ValidationParameters.Add("fieldtwo", FieldTwo);
yield return compareRule;
}
}
和客户端验证码
//PhoneCodePrefixNumber Client Validation Rules
$.validator.addMethod("phonecodeprefixnumber", function (value, element, params) {
// debugger;
var fieldone = params.split(",")[0];
var fieldtwo = params.split(",")[1];
if (params == undefined || params == null || params.length == 0 ||
value == undefined || value == null || value.length == 0 ||
fieldone == undefined || fieldone == null || fieldone.length == 0 ||
fieldtwo == undefined || fieldtwo == null || fieldtwo.length == 0){
return true;
}
var valueFieldOne = $(fieldone).val();
var valueFieldTwo = $(fieldtwo).val();
alert(value + "|" + fieldone + "=" + valueFieldOne + "|" + fieldtwo + "=" + valueFieldTwo);
if (value == "" && valueFieldOne == "" && valueFieldTwo == "")
return true;
if (value == "" || valueFieldOne == "" || valueFieldTwo == "")
return false;
return true;
});
$.validator.unobtrusive.adapters.add("phonecodeprefixnumber", ["fieldone", "fieldtwo"], function (options) {
options.rules["phonecodeprefixnumber"] = "#" + options.params.fieldone + "," + options.params.fieldtwo;
options.messages["phonecodeprefixnumber"] = options.message;
});
【问题讨论】:
标签: asp.net-mvc validation data-annotations custom-attributes