将输入转换为大写的 Uppercase 属性

2023-11-27

我正在 MVC4 中工作,想要使用Uppercase属性。这个想法是,Uppercase 属性的存在将导致模型值在到达服务器时转换为大写。

目前我的模型中有以下代码:

    [Required]
    [Display(Name="Account Code")]
    [StringValidation(RegExValidation.AccountCode, Uppercase=true)]
    public string Account
    {
        get { return _account; }
        set
        {
            if (value != null)
                _account = value.ToUpper();
        }
    }

但我真正想要的是这样的:

    [Required]
    [Display(Name="Account Code")]
    [StringValidation(RegExValidation.AccountCode)]
    [Uppercase]
    public string Account { get; set; }

我认为我可能需要创建大写属性作为ValidationAttribute以确保当模型到达服务器时它会被触发。但这似乎有点错误,因为我并没有真正验证数据。有没有更好的办法?

另外,有什么办法可以保证属性的调用顺序吗?我真的想在自定义之前将数据转换为大写StringValidation属性触发,因为这会检查正则表达式模式中文本的大小写。

为了为此添加一些背景,我想减少添加代码以大写数据的需要。必杀技将是一个单一属性,它可以在模型绑定或验证阶段更新进入服务器的数据。然后可以在该属性中引用该属性StringValidation属性来修改其检查中使用的 RegEx 值。然后我还可以在自定义中查找此属性TextBoxFor辅助方法,这样我可以添加text-transform: uppercase所以它在客户端看起来是正确的。

有人有什么想法吗?


我已经设法让这个工作达到一定程度,所以这是我的解决方案供其他人评估。

需要注意的一点是,无法实现完整的解决方案,因为我无法获得Modelmetadata在 - 的里面StringValidation.IsValid()属性。我在这里遇到的具体问题是我可以获取元数据,但是我无法获取PropertyName从中,仅DisplayName。那里有多种选择,但事实上我的一些房产具有相同的DisplayName意味着我无法确定ProprtyName是我实际验证的那个。

这是代码ValidationAttribute:

public class StringValidationAttribute : ValidationAttribute, IClientValidatable, IMetadataAware {

    private bool _uppercase;

    public StringValidationAttribute(bool uppercase = false) {
         _uppercase = uppercase;
    }

    ...

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["Uppercase"] = _uppercase;
    }
}

然后我创建了一个新的IModelBinder执行:

public class StringBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {           
        ValueProviderResult result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (result == null)
            return null;

        if (bindingContext.ModelMetadata.AdditionalValues.ContainsKey("Uppercase")) {
            if ((bool)bindingContext.ModelMetadata.AdditionalValues["Uppercase"]])
                return result.AttemptedValue.ToUpper();
        }

        return result.AttemptedValue;
    }
}

并在我的中注册了Global.asax file:

ModelBinders.Binders.Add(typeof(string), new StringBinder());

到目前为止的代码将导致任何进入 MVC 的字符串输入转换为大写(如果有)StringValidationAttribute附加到模型上,以及已设置大写指示器的位置。

接下来,为了实现我让 html 表单也变成大写的愿望,我实现了一个新的EditorTemplate named string.cshtml。在这个视图中我添加了:

RouteValueDictionary htmlAttributes = new RouteValueDictionary();
if ((bool)ViewData.ModelMetadata.AdditionalValues["Uppercase"]) {
    htmlAttributes.Add("class", "Uppercase");
}
@Html.TextBox("", Model, htmlAttributes)

与CSS一样;

.Uppercase {
    text-transform: uppercase;
}

希望这篇文章可以帮助其他人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将输入转换为大写的 Uppercase 属性 的相关文章

随机推荐