Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将模型验证结果输出到视图中?_C#_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# 如何将模型验证结果输出到视图中?

C# 如何将模型验证结果输出到视图中?,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我的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; } 在

我的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="@Html.ValidationFor(m => m.Password).MinimumLength"
    ng-maxlength="@Html.ValidationFor(m => m.Password).MaximumLength" />
这就叫这门课

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 "";
        }

    }
}
namespace System.Web.Mvc
{
公共静态类ValidationHelper
{
公共枚举验证AttributeResenum
{
最小长度,
最大长度
}
公共静态字符串ValidationAttributesFor(此HtmlHelper HtmlHelper、表达式、ValidationAttributesEnum val)
{
var metadata=modelmetada.FromLambdaExpression(表达式,htmlHelper.ViewData);
var validators=ModelValidatorProviders.Providers.GetValidators(元数据,htmlHelper.ViewContext);
var rules=validators.SelectMany(v=>v.GetClientValidationRules()).ToList();
if(rules.Any(x=>x为ModelClientValidationStringLengthRule))
{
var p=rules.FirstOrDefault(x=>x是ModelClientValidationStringLengthRule);
if(val.Equals(ValidationAttributesEnum.MinimumLength)){
返回p[“min”].ToString();
}
if(val.Equals(validationAttributesEnum.MaximumLength))
{
返回p[“max”].ToString();
}
}
返回“”;
}
}
}

没有你希望的直接方法。如果使用,则可以通过
ViewData.ModelMetadata
获取有关模板内属性的信息。这很容易让你得到一些东西。您可以使用
ViewData.ModelMetadata.IsRequired
确定是否设置了
[必需]
属性。类似地,您可以通过
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)
@{
var htmlAttributes=新字典();
foreach(ViewData.ModelMetadata.GetValidators(ViewContext)中的var validator.SelectMany(v=>v.GetClientValidationRules()){
var参数=validator.ValidationParameters;
if(验证器为ModelClientValidationRegexRule){
添加(“ng模式”,参数[“模式]);
}else if(验证器为ModelClientValidationRangeRule){
添加(“ng minlength”,参数[“min”]);
添加(“ng maxlength”,参数[“max”]);
}else if(验证器为ModelClientValidationStringLengthRule){
添加(“ng minlength”,参数[“minlength]”);
添加(“ng maxlength”,参数[“maxlength]”);
}
}
}
@Html.TextBox(“,ViewData.TemplateInfo.FormattedModelValue,htmlAttributes)

您可以,也可能应该,将该代码分解成类似于
HtmlHelper
的扩展方法,这样您就可以调用扩展方法并获取属性字典。有关示例,请参见。这也是我改编上述代码的地方。

没有你希望的直接方法。如果使用,则可以通过
ViewData.ModelMetadata
获取有关模板内属性的信息。这很容易让你得到一些东西。您可以使用
ViewData.ModelMetadata.IsRequired
确定是否设置了
[必需]
属性。类似地,您可以通过
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)
@{
var htmlAttributes=新字典();
foreach(ViewData.ModelMetadata.GetValidators(ViewContext)中的var validator.SelectMany(v=>v.GetClientValidationRules()){
var参数=validator.ValidationParameters;
if(验证器为ModelClientValidationRegexRule){
添加(“ng模式”,参数[“模式]);
}else if(验证器为ModelClientValidationRangeRule){
添加(“ng minlength”,参数[“min”]);
添加(“ng maxlength”,参数[“max”]);
}else if(验证器为ModelClientValidationStringLengthRule){
添加(“ng minlength”,参数[“minlength]”);
添加(“ng maxlength”,参数[“maxlength]”);
}
}
}
@Html.TextBox(“,ViewData.TemplateInfo.FormattedModelValue,htmlAttributes)

您可以,也可能应该,将该代码分解成类似于
HtmlHelper
的扩展方法,这样您就可以调用扩展方法并获取属性字典。有关示例,请参见。这也是我改编上述代码的地方。

谢谢!检查我的编辑上面,看看我想出了什么!如有任何改进建议,将不胜感激!谢谢检查我的编辑上面,看看我想出了什么!如有任何改进建议,将不胜感激!