[英]How do I get the model validation decorations output to my view?
我的MVC應用程序中有以下數據模型
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
在視圖中我使用的是AngularJS,我寧願讓它在前面進行盡可能多的驗證,而不是像檢查字符串的長度一樣簡單地到服務器。
現在我必須硬編碼<input ng-minlength="6" ng-maxlength="100" />
- 但有沒有辦法從模型的裝飾中獲取這些數字? 這是我希望可以做的一些偽代碼:
<input
ng-minlength="@Html.ValidationFor(m => m.Password).MinimumLength"
ng-maxlength="@Html.ValidationFor(m => m.Password).MaximumLength" />
同樣,如果使用[EmailAddress]
修飾模型,是否可以獲取用於輸出到我的視圖中的正則表達式?
非常感謝@ChrisPratt指出我正確的方向! 我在那里使用他的基本代碼來制作我需要的幫助器。 這並不完美,但這是我的第一次拍攝並且有效。
現在我可以使用以下內容
@Html.ValidationAttributesFor(m => m.Password, ValidationHelper.ValidationAttributresEnum.MinimumLength)
那會叫這個班級
namespace System.Web.Mvc
{
public static class ValidationHelper
{
public enum ValidationAttributresEnum
{
MinimumLength,
MaximumLength
}
public static string ValidationAttributesFor<TParameter, TValue>(this HtmlHelper<TParameter> htmlHelper, Expression<Func<TParameter, TValue>> expression, ValidationAttributresEnum val)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var validators = ModelValidatorProviders.Providers.GetValidators(metadata, htmlHelper.ViewContext);
var rules = validators.SelectMany(v => v.GetClientValidationRules()).ToList();
if (rules.Any(x => x is ModelClientValidationStringLengthRule))
{
var p = rules.FirstOrDefault(x => x is ModelClientValidationStringLengthRule).ValidationParameters;
if(val.Equals(ValidationAttributresEnum.MinimumLength)){
return p["min"].ToString();
}
if (val.Equals(ValidationAttributresEnum.MaximumLength))
{
return p["max"].ToString();
}
}
return "";
}
}
}
沒有像你希望的直接方式。 如果使用編輯器模板,則可以通過ViewData.ModelMetadata
獲取有關模板內屬性的信息。 這讓你輕松掌握了一些東西。 您可以使用ViewData.ModelMetadata.IsRequired
來確定是否已設置[Required]
屬性。 同樣,您可以通過ViewData.ModelMetadata.DisplayFormatString
獲取格式字符串之類的內容。 對於像數據類型( DataType.EmailAddress
等)這樣的東西,你可以從ViewData.ModelMetadata.DataTypeName
獲取它。 但是,這只會告訴您所設置的類型,而不是用於驗證它的正則表達式或其他任何內容。
對於更復雜的驗證規則,您需要以下內容:
@{
var htmlAttributes = new Dictionary<string, string>();
foreach(var validator in ViewData.ModelMetadata.GetValidators(ViewContext).SelectMany(v => v.GetClientValidationRules())) {
var parameters = validator.ValidationParameters;
if(validator is ModelClientValidationRegexRule) {
htmlAttributes.Add("ng-pattern", parameters["pattern"]);
} else if(validator is ModelClientValidationRangeRule) {
htmlAttributes.Add("ng-minlength", parameters["min"]);
htmlAttributes.Add("ng-maxlength", parameters["max"]);
} else if(validator is ModelClientValidationStringLengthRule) {
htmlAttributes.Add("ng-minlength", parameters["minlength"]);
htmlAttributes.Add("ng-maxlength", parameters["maxlength"]);
}
}
}
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, htmlAttributes)
您可以並且可能應該將該代碼分解為HtmlHelper
類的擴展方法,因此您只需調用擴展方法並獲取屬性字典即可。 有關示例,請參閱https://gist.github.com/andybooth/1029068 。 這也是我改編上面代碼的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.