不允许Guid.Empty

不允许Guid.Empty

问题描述:

我在我的课程中有很多Guid属性,我想确保Guid.Empty将使ModelState无效。处理这个问题的最好方法是什么?不允许Guid.Empty

说,我有一个用户提交到我的API操作方法如下类:

{ 
    public Guid Id { get; set: } 

    [Required] 
    public string name { get; set: } 
} 

通过使用[Required],我要确保用户必须总是给我一些在名称字段,但如果用户不提供Id,它变为Guid.EmptyModelState仍然有效。

我想确保在Id属性中总是得到Guid值,而不是Guid.Empty

+0

认沽'[必需]''上Id'为好。 – Igor

+0

这不起作用。即使用户没有提供值,它也会变成Guid.Empty,ModelState会将其视为有效。 – Sam

+1

@Igor - 它必须是'Guid?',因为它起作用了吗? – hatchet

因此,这里有超级简单的步骤:

首先,我创建了一个新的命名CustomAttributeNoGuidEmpty.cs类,并把它在我的“utils的/验证”文件夹中。我发现有些人把它放在了App_Code之下,这也很好。

类看起来是这样的:

using System; 
using System.ComponentModel.DataAnnotations; 

namespace MyApp.Utils.Validation 
{ 
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] 
    sealed public class CustomAttributeNoGuidEmpty : ValidationAttribute 
    { 
     public override bool IsValid(Object value) 
     { 
      bool result = true; 

      if ((Guid)value == Guid.Empty) 
       result = false; 

      return result; 
     } 
    } 
} 

我后来干脆将其应用到性能在我的课。很显然,我需要using引用它:

using MyApp.Utils.Validation; 

{ 
    [CustomAttributeNoGuidEmpty] 
    public Guid Id { get; set; } 

    [Required] 
    public string Name { get; set; } 
} 

现在,除非id的值是一个有效的GuidModelState变为无效。这包括Id字段值为Guid.Empty的情况。

+1

只是想知道:为什么你的观点中有指导呢? –

+0

你的意思是代替使用INT或其他东西? – Sam

+1

好吧,你似乎依靠用户提供一个有效的指导。 Tha不好。使用id是一种可能性,并且在视图中不使用任何键(但是保存它们并从会话中获取它们)也是值得考虑的。 –

作为一种可能的解决方案,您可以使用可空的Guid,因此默认值将为null,您将能够使用Required对其进行检查。

该解决方案将是这样的:

{ 
    [Required] 
    public Guid? Id { get; set: } 

    [Required] 
    public string name { get; set: } 
} 
+0

这如何帮助预防Guid.Empty?这里的关键要求是确保我们不允许Guid.Empty。 – Sam