[英]How to create a custom validation attribute with parameters consisting of model properties
[英]How to create custom validation attribute?
我正在嘗試創建自定義驗證屬性。
public class PhoneValidator : ValidationAttribute
{
public override bool IsValid(object value)
{
return new RegularExpressionAttribute(@"^[+0]\d+").IsValid(Convert.ToString(value).Trim());
}
}
我用這個來使用
[PhoneValidator]
public string PhoneNumber { get; private set; }
我是從網站上復制過來的,理論上應該可以。 但我無法讓它發揮作用。
1-為此創建一個class
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class MobileValidationAttribute : ValidationAttribute
{
public MobileValidationAttribute(string errorMessage)
{
ErrorMessage = errorMessage;
}
public override bool IsValid(object value)
{
if (value == null) return false;
return value.ToString().Length == 13;
}
}
2-創建一個model
public class UserModel
{
[Display(Name ="Phone Number")]
[MobileValidation("{0} is invalid")]
[Required(AllowEmptyStrings =false,ErrorMessage ="{0} is required")]
public string PhoneNumber { get; set; }
}
3- 在視圖中使用此代碼
@model TestAttribute.Models.UserModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
<form method="post" action="/Home/Index">
@Html.LabelFor(a=>a.PhoneNumber)
@Html.TextBoxFor(a=>a.PhoneNumber)
@Html.ValidationMessageFor(a=>a.PhoneNumber)
<br />
<br />
<button type="submit">Add</button>
</form>
</div>
</body>
</html>
4-和Controller
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new UserModel());
}
[HttpPost]
public ActionResult Index(UserModel model)
{
if (ModelState.IsValid)
{
return Content("Ok");
}
return View(model);
}
}
這是MSDN的示例:
PhoneMaskAttribute .cs:
using System;
using System.Globalization;
using System.ComponentModel.DataAnnotations;
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
sealed public class PhoneMaskAttribute : ValidationAttribute
{
// Internal field to hold the mask value.
readonly string _mask;
public string Mask
{
get { return _mask; }
}
public PhoneMaskAttribute(string mask)
{
_mask = mask;
}
public override bool IsValid(object value)
{
var phoneNumber = (String)value;
bool result = true;
if (this.Mask != null)
{
result = MatchesMask(this.Mask, phoneNumber);
}
return result;
}
// Checks if the entered phone number matches the mask.
internal bool MatchesMask(string mask, string phoneNumber)
{
if (mask.Length != phoneNumber.Trim().Length)
{
// Length mismatch.
return false;
}
for (int i = 0; i < mask.Length; i++)
{
if (mask[i] == 'd' && char.IsDigit(phoneNumber[i]) == false)
{
// Digit expected at this position.
return false;
}
if (mask[i] == '-' && phoneNumber[i] != '-')
{
// Spacing character expected at this position.
return false;
}
}
return true;
}
public override string FormatErrorMessage(string name)
{
return String.Format(CultureInfo.CurrentCulture,
ErrorMessageString, name, this.Mask);
}
}
用法:
CustomerMetadata.cs:
using System.Web.DynamicData;
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(CustomerMetadata))]
public partial class Customer
{
}
public class CustomerMetadata
{
[PhoneMask("999-999-9999",
ErrorMessage = "{0} value does not match the mask {1}.")]
public object Phone;
}
鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.