当前位置: 首页 > 编程语言 > C#

Guid的验证分享

时间:2023-04-11 03:41:01 C#

Guid的验证我有一个强类型视图,它有一个DropDownListFor属性。下拉列表中的每个项目都由一个GUID表示。我所追求的是一种验证用户是否从下拉列表中选择项目的方法。目前我还没有看到用于执行此操作的数据注释。无论如何使用数据注释来实现这一点,所以客户端和服务器端验证将起作用。我猜我需要制作一个自定义方法来执行此操作,但想知道是否已经存在任何东西。实际上,您不能在GUID中使用Required属性(没有我在下面提到的方法),因为它们继承自结构,因此它们的默认值实际上是Guid.Empty的一个实例,它将满足Required属性的Required。现在说,有可能得到你想要的,只要让你的财产可以为空,例如以此为例...publicclassPerson{[Required]//只因为Guid可以为空publicGuid?PersonId{得到;设置;}公共字符串名字{得到;设置;}公共字符串姓氏{得到;set;}}通过将GUID标记为可空(使用?或Nullable,如果您喜欢较长的方式),在绑定浏览器中从服务器发送内容时将其保留为空。在您的情况下,只需确保下拉菜单的默认选项的值有一个空字符串作为其值。编辑:这种方法的唯一警告是您最终不得不使用类似Person.GetValueOfDefault()的东西,并且可能测试Guid.Empty。我厌倦了这样做,最终创建了我自己的验证属性来帮助简化validationGuids(以及任何其他具有我想视为无效的默认值的类型,如int、DateTime等)。但是我还没有客户端身份验证,所以身份验证只发生在服务器上。但是,如果你使用可空类型,它可以与[Required]结合使用(旨在不重复[Required]功能)。那么至少您将获得[Required]的客户端身份验证。这意味着您仍然必须使用GetValueOrDefault(),但至少您不必再测试Guid.Empty。Gist链接有一些带有示例的XMLDocs,为简洁起见,我将把它们留在这里。我目前正在使用ASP.NETCore。关键点:RequireNonDefaultAttribute[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field|AttributeTargets.Parameter,AllowMultiple=false)]value){returnvalue!=null&&!Equals(value,Activator.CreateInstance(value.GetType()));}}编辑答案在重新阅读你的问题时,听起来你只是想知道是否选择了某个值。如果是这种情况,则只需将RequiredAttribute应用于Guid属性并使其在模型上可为空publicclassGuidModel{[Required]publicGuid?引导{得到;放;}publicIEnumerableGuids{get;放;然后在强类型视图中(使用@modelGuidModel)@Html.ValidationMessageFor(m=>m.Guid)@Html.DropDownListFor(m=>m.Guid,Model.Guids.Select(g=>newSelectListItem{Text=g.ToString(),Value=g.ToString()}),"--SelectGuid--")为客户端认证添加客户端认证JavaScript脚本参考。控制器看起来像publicclassGuidsController:Controller{publicGuidRepositoryGuidRepo{get;私有集;}publicGuidsController(GuidRepositoryguidRepo){GuidRepo=guidRepo;}[HttpGet]publicActionResultEdit(intid){varguid=GuidRepo.GetForId(id);varguids-GuidRepo.All();返回视图(新GuidModel{Guid=guid,Guids=guids});}[HttpPost]publicActionResultEdit(GuidModelmodel){if(!ModelState.IsValid){model.Guids=GuidRepo.All();返回视图(模型);}/*更新数据库*/returnRedirectToAction("Edit");这将确保模型绑定GuidModel需要Guid属性。原始答案我不相信有一个开箱即用的数据注释验证属性可以做到这一点。我写了一篇关于如何做到这一点的博客文章;该帖子使用了一个IoC容器,但如果你想让某些东西起作用,你可以求助于硬编码的依赖项。就像publicclassValidGuidAttribute:ValidationAttribute{privateconststringDefaultErrorMessage="'{0}'不包含有效的guid";publicValidGuidAttribute():base(DefaultErrorMessage){}protectedoverrideValidationResultIsValid(objectvalue,ValidationContextvalidationContext){varinput=Convert.ToString(value,CultureInfo.CurrentCulture);//让Required属性负责此验证if(string.IsNullOrWhiteSpace(input)){returnnull;}//获取所有的guid(假设正在使用repo)varguids=newGuidRepository().AllGuids();指导指导;if(!Guid.TryParse(input,outguid)){//不是guid的有效字符串表示returnnewValidationResult(FormatErrorMessage(validationContext.DisplayName));}//传递的guid是我们知道的吗?返回guids.Any(g=>g==guid)?新的ValidationResult(FormatErrorMessage(validationContext.DisplayName)):null;}}然后在您发送到控制器操作的模型上公共类GuidModel{[ValidGuid]publicGuidguid{get;放;这为您提供服务器端验证您可以编写客户端验证来执行此操作,也许使用RemoteAttribute但在这种情况下我看不到太多价值,因为唯一会看到此客户端验证的人是弄乱DOM中的值;这对普通用户没有任何好处。我知道这是一个老问题,但如果其他人有兴趣,我设法通过创建[IsNotEmpty]注释来解决这个问题(在我的例子中使Guid可以为空)。这使用反射来确定属性上是否有Empty的实现,如果有,则进行比较。以上就是C#学习教程:Guid的校验分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望你多多关注——publicclassIsNotEmptyAttribute:ValidationAttribute{publicoverrideboolIsValid(objectvalue){if(value==null)return错误的;varvalueType=value.GetType();varemptyField=valueType.GetField("空");如果(emptyField==null)返回真;varemptyValue=emptyField.GetValue(null);返回!value.Equals(emptyValue);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: