【问题标题】:Not getting data-val attributes for GUID未获取 GUID 的 data-val 属性
【发布时间】:2014-11-24 11:48:06
【问题描述】:

我正在做一个更大的项目,我们有很多视图,几乎所有视图都有一个或更多的 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

【问题讨论】:

  • 您期望什么 data-val 属性?
  • 啊,好点子,应该在问题中包含这个:至少data-val="true",但由于数字也得到data-val-number="message here",我猜想data-val-guid="message here"之类的。

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


【解决方案1】:

没有data-val-* 属性被呈现,因为没有用于GUID 的jquery.validate.unobtrusive 适配器。如果您要使属性为空并添加[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]{4}-[A-Za-z0-9]{12}$ 应该可以工作)。

但是这似乎没有必要,因为您正在使用 @Html.DropDownListFor() 并且(我假设)您在控制器上构建了一个 SelectList,它只包含 SelectListItem.Value 属性的 GUID(为什么要呈现一个无效的选项- 除了与[Required] 属性一起使用的“--请选择--”标签选项之外?)。

【讨论】:

  • 我已经尝试过Guid?[Required],但我仍然没有从中获得任何属性。你是对的,我不需要客户端验证 Guid 值。我需要客户端的data-val-* 属性来在选择值时隐藏所需的文本。
  • 对我来说效果很好并呈现<select data-val="true" data-val-required="The MyGUID field is required." id="MyGUID " name="MyGUID " class="valid">
  • 什么意思客户端需要data-val-*属性来隐藏所需的文本?什么“文本”?它与数据属性有什么关系?
  • 我忘记了我们创建了自己的RequiredAttribute,这并没有提供任何html属性。如果我改回基本的[Required],那么它可以工作。所以我需要找到一种方法来使用我们自己的Required。将此答案标记为正确答案。
【解决方案2】:

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

其次,我要说的是,对于从事该项目的其他开发人员来说,对每个属性进行数据注释的显式验证比进行一些“非标准”验证巫术要清晰得多。

您可能可以使用操作过滤器来实现这一点(查找 Guid 类型的任何属性),但我认为这会使您的模型的使用/规范不太能表达其意图,并且只会造成混淆。

【讨论】:

  • 拥有多个注释确实不是问题,但是项目中有超过 100 个视图模型需要更新。这就是为什么“全局”解决方案会很好的原因,因为手动更新这么多文件很可能会导致丢失一些文件。
【解决方案3】:

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

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

【讨论】:

  • 感谢您的评论。我认为我的问题需要改进。我不希望客户端检查其自身的 Guid 是否有效,因为它是在服务器上创建的下拉列表,其中只有有效的 Guid。我需要的是客户端在选择值时隐藏所需的文本。这适用于字符串、数字等
猜你喜欢
  • 1970-01-01
  • 2017-10-06
  • 2019-12-23
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
相关资源
最近更新 更多