int数据类型的服务器端验证
本文关键字:验证 服务器端 数据类型 int | 更新日期: 2023-09-27 18:29:26
我制作了自定义验证器属性
partial class DataTypeInt : ValidationAttribute
{
public DataTypeInt(string resourceName)
{
base.ErrorMessageResourceType = typeof(blueddPES.Resources.PES.Resource);
base.ErrorMessageResourceName = resourceName;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
string number = value.ToString().Trim();
int val;
bool result = int.TryParse(number,out val );
if (result)
{
return ValidationResult.Success;
}
else
{
return new ValidationResult("");
}
}
}
但当在我的文本框中输入字符串而不是int值时,则为value==null
,当我输入int值时为value==entered value;
。为什么?
有没有其他方法可以实现同样的效果(请确保仅在服务器端)
发生这种情况的原因是模型绑定器(在任何验证器之前运行)无法将无效值绑定到整数。这就是为什么在验证器中你没有得到任何价值。如果你想验证这一点,你可以为整数类型编写一个自定义模型绑定器。
以下是这种模型活页夹的样子:
public class IntegerBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
int temp;
if (value == null ||
string.IsNullOrEmpty(value.AttemptedValue) ||
!int.TryParse(value.AttemptedValue, out temp)
)
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, "invalid integer");
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, value);
return null;
}
return temp;
}
}
您将在Application_Start
:中注册
ModelBinders.Binders.Add(typeof(int), new IntegerBinder());
但您可能会问:如果我想自定义错误消息,该怎么办?毕竟,这正是我最初想要实现的目标。当默认的模型绑定器已经为我做了这件事,只是我无法自定义错误消息时,编写这个模型绑定器有什么意义?
这很容易。您可以创建一个自定义属性,该属性将用于装饰视图模型,并包含错误消息,在模型绑定器中,您可以获取此错误消息并使用它。
因此,您可以有一个伪验证器属性:
public class MustBeAValidInteger : ValidationAttribute, IMetadataAware
{
public override bool IsValid(object value)
{
return true;
}
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.AdditionalValues["errorMessage"] = ErrorMessage;
}
}
你可以用来装饰你的视图模型:
[MustBeAValidInteger(ErrorMessage = "The value {0} is not a valid quantity")]
public int Quantity { get; set; }
并调整模型绑定器:
public class IntegerBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
int temp;
var attemptedValue = value != null ? value.AttemptedValue : string.Empty;
if (!int.TryParse(attemptedValue, out temp)
)
{
var errorMessage = "{0} is an invalid integer";
if (bindingContext.ModelMetadata.AdditionalValues.ContainsKey("errorMessage"))
{
errorMessage = bindingContext.ModelMetadata.AdditionalValues["errorMessage"] as string;
}
errorMessage = string.Format(errorMessage, attemptedValue);
bindingContext.ModelState.AddModelError(bindingContext.ModelName, errorMessage);
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, value);
return null;
}
return temp;
}
}