c#特定模型和特定变量类型的自定义模型绑定器

时间:2014-11-04 12:40:10

标签: c# asp.net-mvc

我自己有一个可以为空的int和验证文本的问题。

基本上我想更改在未提供可空int时显示的验证消息

所以来自

"The value 'xxxxxxxxxxxxxxxxxxxx' is invalid" 

"Please provide a valid number"

我自己就是这样的自定义模型绑定器

public class IntModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var integerValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            if (integerValue == null || integerValue.AttemptedValue == "")
                return null;

            var integer = integerValue.AttemptedValue;

            bindingContext.ModelState.SetModelValue(bindingContext.ModelName, bindingContext.ValueProvider.GetValue(bindingContext.ModelName));
            try
            {
                return int.Parse(integer);
            }
            catch (Exception)
            {
                bindingContext.ModelState.AddModelError(bindingContext.ModelName, String.Format("\"{0}\" is invalid, please provide a valid number.", bindingContext.ModelName));
                return null;
            }
        }
    }

现在我已经更新了我的global.asax.cs所以所有可以为空的int都使用这个模型绑定器,但是我不希望所有可以为空的int都使用它,我只想要一个特定的模型来使用它并且只使用我的模型绑定器在该模型中可为空的int。有没有办法可以将这个模型绑定器绑定到我的模型,并且只与可以为空的int变量相关联?

我试图在我的模型上使用我的modebinder,如此

[ModelBinder(typeof(IntModelBinder))]
public class CreateQuoteModel
{
    ....
}

但它没有检查可空的整数,我想避免第三方插件

2 个答案:

答案 0 :(得分:1)

您在可以为空的整数中返回null

if (integerValue == null || integerValue.AttemptedValue == "")
   return null;

因此您不会在可以为空的整数中将该错误添加到您的模型中。
我建议你使用

int result=0;
if(!int.TryParse(integer, out result)){
   bindingContext.ModelState.AddModelError(bindingContext.ModelName, String.Format("\"{0}\" is invalid, please provide a valid number.", bindingContext.ModelName));
   return null;
}
return result;

而不是你的异常处理流程来避免这种反模式

答案 1 :(得分:1)

当然,只要你的模型上有一个可以为空的int,并且带有自定义消息的必需属性就可以了吗?

相反,您可以使用正则表达式匹配来检查长度和类型