在视图中动态添加“ data-val”和“ data-val-required”是否错误?

安德烈五世

我有一个ViewModel,可以用该[Required]属性装饰(请参见下文)。我已经到了需要让客户端控制是否需要哪些字段的地步。他们可以配置该低谷XML,并且所有这些信息在首次创建时都存储在模型中。现在,我的字段没有修饰,[Required]但仍需要在提交之前进行验证(按照“用户设置”)(例如,该Phone字段)。

public class MyBusinessObjectViewModel
{
    [Required]
    public string Email { get; set; } //compulsory

    public string Phone { get; set; } //not (yet) compulsory, but might become
}

如果用户不输入该Phone号码,该数据仍将被发布。为了不弄乱自定义验证器,我只向HTML添加“ data-val”和“ data-val-required”属性,如下所示:

Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("data-val", "true");
dict.Add("data-val-required", "This field is required.");
@Html.TextBoxFor(x => x, dict); 

这将强制对所有根据需要动态设置的属性进行客户端验证。这是好习惯吗?我可以期待什么样的副作用?

保罗

您应该考虑使用自己的元数据提供程序扩展元模型框架,以在站点的配置和模型元数据之间进行实际绑定。实际上,您可以在元数据创建过程中将属性模型元数据上required属性标志设置为true。我不确定是否会导致内置编辑器模板生成该属性,但是我认为确实如此。最坏的情况是,您实际上可以创建一个新RequiredAttribute属性并将其附加到该属性,虽然有点笨拙,但在某些情况下效果很好。

您也可以使用IMetadataAware属性来执行此操作,尤其是如果这Required是用户可以自定义的唯一元数据方面,但是实现方式实际上取决于您要执行的操作。

在特定情况下使用自定义ModelMetadataProvider的一个主要优点是,可以使用依赖项注入(通过ModelMetadataProviders)将客户设置持久性机制纳入范围,而使用data属性,您只能编写一个隔离的方法,该方法在之后立即运行元数据模型已创建。

这是自定义模型元数据提供程序的示例实现,您只需要将客户端设置更改为想要使用的任何设置即可。

已更新,但未经测试

public class ClientSettingsProvider
{
    public ClientSettingsProvider(/* db info */) { /* init */ }

    public bool IsPropertyRequired(string propertyIdentifier)
    {
       // check the property identifier here and return status
    }

}

public ClientRequiredAttribute : Attribute
{
    string _identifier;
    public string Identifier { get { return _identifer; } }
    public ClientRequiredAttribute(string identifier)
    { _identifier = identifier; }
}

public class RequiredModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    ClientSettings _clientSettings;

    public RequiredModelMetadataProvider(ClientSettings clientSettings)
    {
        _clientSettings = clientSettings;
    }

    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
    {
        // alternatively here is where you could 'inject' a RequiredAttribute into the attributes list

        var clientRequiredAttribute = attributes.OfType<ClientRequiredAttribute>().SingleOrDefault();
        if(clientRequiredAttribute != null && _clientSettings.IsPropertyRequired(clientRequiredAttribute.Identifier))
        {
            // By injecting the Required attribute here it will seem to 
            // the base provider we are extending as if the property was
            // marked with [Required]. Your data validation attributes should
            // be added, provide you are using the default editor templates in
            // you view.
            attributes = attributes.Union(new [] { new RequiredAttribute() });
        }

        var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);

        // REMOVED, this is another way but I'm not 100% sure it will add your attributes
        // Use whatever attributes you need here as parameters...
        //if (_clientSettings.IsPropertyRequired(containerType, propertyName))
        //{
        //    metadata.IsRequired = true;
        //}

        return metadata;
    }
}

用法

public class MyModel
{
     [ClientRequired("CompanyName")]
     public string Company { get; set; }
}

public class MyOtherModel
{
     [ClientRequired("CompanyName")]
     public string Name { get; set; }

     public string Address { get; set; }
}

这两个模型都将针对您的客户端设置提供程序验证字符串“ CompanyName”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

jQuery-将此val()添加为类

来自分类Dev

在@ html.DropdownListFor()中禁用data-val-number

来自分类Dev

var和val的Scala内部

来自分类Dev

根据抽象val的成员定义val(Scala错误?)

来自分类Dev

在Scala中,最终val和val之间的差异

来自分类Dev

Val功能和过载通知

来自分类Dev

在Ruby中,val和val.nil是吗?相同的?

来自分类Dev

VBA:评估(字符串)和Val(字符串)之间是否有任何区别

来自分类Dev

.val()舍入?

来自分类Dev

不会生成MVC非侵入式验证data-val- *标记属性

来自分类Dev

Scala val和类型同时

来自分类Dev

是否可以在类中使用.val?

来自分类Dev

“内联” val后出现奇怪的类型错误

来自分类Dev

jQuery-从$(this).val()设置data()变量

来自分类Dev

在Ajax Data参数内使用Val()

来自分类Dev

.val()和.length错误

来自分类Dev

Spring thymeleaf将th:text添加到data-def-val

来自分类Dev

Val功能和过载通知

来自分类Dev

在Ruby中,val和val.nil是吗?相同的?

来自分类Dev

不会生成MVC非侵入式验证data-val- *标记属性

来自分类Dev

比较select.val()和span.text()后结果错误

来自分类Dev

检查是否需要data-val

来自分类Dev

$(select).val()。null的长度给出错误

来自分类Dev

Python Keras cross_val_score错误

来自分类Dev

Jquery .val() 和 .reduce(知道所有值是否为空)

来自分类Dev

Scala 中的 val 和 def

来自分类Dev

类型错误:val.split 不是函数

来自分类Dev

int *val = otherVal 和 int val = otherVal 之间的指针差异

来自分类Dev

ValueError: `validation_data` 应该是一个元组 `(val_x, val_y, val_sample_weight)` 或 `(val_x, val_y)`。找到:<__main__.Generator 对象在>

Related 相关文章

热门标签

归档