C# 无法获取GUID的数据val属性

C# 无法获取GUID的数据val属性,c#,asp.net-mvc-4,validation,C#,Asp.net Mvc 4,Validation,我正在处理一个更大的项目,我们有很多视图,几乎所有视图都有一个或多个SelectList,其值是GUID。viewmodel工作良好,服务器端验证也很好,问题是HTML select元素没有获得任何数据val属性,我们使用的是HTML.DropDownListFor。当值很短、字符串很短等但不是GUID时,它可以正常工作 有没有一种方法可以在不向viewmodels中的所有GUID属性添加ValidationAttribute的情况下获取数据val属性?因为那里有很多战利品 最终对我有用的是:

我正在处理一个更大的项目,我们有很多视图,几乎所有视图都有一个或多个SelectList,其值是GUID。viewmodel工作良好,服务器端验证也很好,问题是HTML select元素没有获得任何数据val属性,我们使用的是HTML.DropDownListFor。当值很短、字符串很短等但不是GUID时,它可以正常工作

有没有一种方法可以在不向viewmodels中的所有GUID属性添加ValidationAttribute的情况下获取数据val属性?因为那里有很多战利品

最终对我有用的是:

我得到了Stephen Muecke的正确答案:我们正在使用自己的RequiredAttribute:

public class LocalizedRequiredAttribute : RequiredAttribute
{
    public LocalizedRequiredAttribute()
    {
        ErrorMessageResourceName = "Required";
        ErrorMessageResourceType = typeof (Resources.ErrorMessages);
    }
}
但这并没有像基本的[Required]那样添加任何客户端验证属性,但很容易修复。只需将此代码添加到应用程序\u开始:

现在您将获得data val=true data val required=message。
这里找到的解决方案:

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

第二,我要说的是,与使用一些非标准验证巫术相比,在每个属性上使用数据注释进行显式验证对项目中的其他开发人员来说要清晰得多,可读性也更高


您可能可以通过操作过滤器查找Guid类型的任何属性来实现这一点,但我认为这将使模型的使用/规范不太能表达它们的意图,并且容易混淆。

Guid的内容中有破折号,可能会出现问题。您可以尝试在生成GUI的末尾使用.ToString'N'来删除破折号。或者,您可以编写jquery hack,在客户端的破折号之前添加转义字符。甚至更多;尝试实现您自己的guid验证方法,如下所示:

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

没有呈现数据val-*属性,因为没有用于GUID的jquery.validate.unobtrusive适配器。如果要使属性为Null并添加[required]属性,唯一可以从框中取出的是data val required和关联的data val

如果您想要一些客户端验证,您可以使用未测试的[RegularExpression]属性,但我认为^[a-Za-z0-9]{8}-[a-Za-z0-9]{4}-[a-Za-z0-9]{4}-[a-Za-z0-9]{12}$应该可以工作


但是,由于您使用的是@Html.DropDownListFor,并且我假设您在控制器上构建的SelectList只包含SelectListItem.Value属性的GUID,因此它似乎没有必要。为什么要呈现一个无效的选项,而不是一个用于[Required]的-Please select-label选项属性?

您期望哪些数据val属性?啊,好的一点,应该在问题中包括这一点:数据val=true,但由于数字在这里也会得到数据val number=message,我想这里也应该是data val guid=message。我试过guid吗?和[必需],但我仍然无法从中获得任何属性。您是对的,我不需要对Guid值进行客户端验证。选择值时,我需要客户端的data val-*属性来隐藏所需的文本。对我来说效果很好,并呈现您认为客户端需要data val-*属性来隐藏所需的文本是什么意思?什么“文本”?它和数据属性有什么关系?我忘了我们创建了自己的RequiredAttribute,而这并没有提供任何html属性。如果我改回基本[必需],它就会工作。因此,我需要找到一种方法,用我们自己的需要来做这件事。将此答案标记为正确答案。谢谢您的评论。我认为我的问题需要改进。我不希望客户端检查其中的Guid本身是否有效,因为它是在服务器上创建的下拉列表,其中只有有效的Guid。我需要的是客户端在选择值时隐藏所需的文本。这对于字符串来说是开箱即用的,数字etcIt拥有多个注释并不是一个问题,但是项目中有超过100个视图模型需要更新。这就是为什么一个全局解决方案是好的,因为手动更新这么多文件很可能会导致一些文件丢失。
        DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof (LocalizedRequiredAttribute),
            typeof (RequiredAttributeAdapter));