簡體   English   中英

如何將模型驗證裝飾輸出到我的視圖?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM