我正在开发一个更大的项目,我们有很多视图,几乎所有视图都有一个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
答案 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]
属性?)。