C# 如何将模型验证结果输出到视图中?
我的MVC应用程序中有以下数据模型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; } 在
[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
的扩展方法,这样您就可以调用扩展方法并获取属性字典。有关示例,请参见。这也是我改编上述代码的地方。谢谢!检查我的编辑上面,看看我想出了什么!如有任何改进建议,将不胜感激!谢谢检查我的编辑上面,看看我想出了什么!如有任何改进建议,将不胜感激!