没有获取GUID的data-val属性

时间:2014-11-24 11:48:07

标签: c# asp.net-mvc-4 validation

我正在开发一个更大的项目,我们有很多视图,几乎所有视图都有一个SelectList或更多,其值为GUID。 viewmodel工作正常,服务器端验证也是如此,问题是HTML select元素没有得到任何data-val属性,我们使用的是Html.DropDownListFor。当值很短,字符串等而不是GUID时,它工作正常。

有没有办法在不向视图模型中的所有GUID属性添加ValidationAttribute的情况下获取data-val属性?因为有一些战利品。


最终对我有用的是什么:

我通过 Stephen Muecke的回答走上正轨:我们正在使用我们自己的RequiredAttribute:

public class LocalizedRequiredAttribute : RequiredAttribute
{
    public LocalizedRequiredAttribute()
    {
        ErrorMessageResourceName = "Required";
        ErrorMessageResourceType = typeof (Resources.ErrorMessages);
    }
}

但是这并没有像基本[Required]那样添加任何客户端验证属性,但它很容易修复。只需将此代码添加到Application_Start()

即可
        DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof (LocalizedRequiredAttribute),
            typeof (RequiredAttributeAdapter));

现在你将获得data-val=true data-val-required="message"。 解决方案:https://stackoverflow.com/a/12573540/1225758

3 个答案:

答案 0 :(得分:0)

首先,我想知道在模型属性上有多个GUID数据注释的问题是什么?

其次我要说的是,对于在项目上工作的其他开发人员来说,使用每个属性上的数据注释进行显式验证比使用某些"非标准"更加清晰和可读。验证伏都教正在进行中。

你可以通过动作过滤器来实现这一点(寻找Guid类型的任何属性),但我认为这会使你的模型的使用/规范表达不太明确的意图,而只是混淆。

答案 1 :(得分:0)

Guids内容破灭,可能会出现问题。您可以尝试在生成它们的Guids末尾使用.ToString('N')来删除破折号。或者您可以编写一个jquery hack来在客户端破折号之前添加转义字符。甚至更多;尝试在此处实现您自己的guid验证方法:How to test valid UUID/GUID?

甚至更多,您可以尝试实现自己的guid注释属性,如下所示: Validation of Guid

答案 2 :(得分:0)

没有呈现data-val-*个属性,因为GUID没有jquery.validate.unobtrusive个适配器。如果您要将该属性设为可为空并添加data-val-required属性,则唯一可以开箱即用的是data-val(以及关联的[Required])。

如果您想要一些客户端验证,可以使用[RegularExpression]属性(未经过测试,但我认为^[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}$应该有效)。

然而,由于您正在使用@Html.DropDownListFor()和(我假设)您在控制器上构建SelectList并且仅包含SelectListItem.Value属性的GUID,因此似乎没有必要(你为什么要渲染一个无效的选项 - 除了" - 请选择 - "标签选项以用于[Required]属性?)。