2017-01-23 2 views
3

У меня есть много Guid свойств в моих классах, и я хочу, чтобы убедиться, что Guid.Empty сделает ModelStateнедействительным. Каков наилучший способ справиться с этим?Не позволяя Guid.Empty

Скажем, у меня есть следующий класс, который пользователь отправляет на мой метод действия API:

{ 
    public Guid Id { get; set: } 

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

Используя [Required], я убедиться, что пользователь всегда должен дать мне что-то в поле имени, но если пользователь не предоставляет Id, он становится Guid.Empty и ModelState по-прежнему действует.

Я хочу быть уверенным, что всегда буду иметь значение Guid в собственности Id и НЕ Guid.Empty.

+0

Put '[Требуется]' 'на Id', а также. – Igor

+0

Это не работает. Даже если пользователь не предоставляет значение, он становится Guid.Empty и ModelState принимает его как действительное. – Sam

+1

@Igor - Это должно быть «Guid?» Для того, чтобы работать, не так ли? – hatchet

ответ

3

Итак, вот супер легкие шаги:

Во-первых, я создал новый именованный CustomAttributeNoGuidEmpty.cs класса и поместили его под моей папке «Utils/Validation». Я вижу, что некоторые люди помещают его под 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

Ну, похоже, вы полагаетесь на пользователя, чтобы предоставить действительный guid. Та не может быть хорошо. Использование id - это возможность и не использование каких-либо ключей в представлениях (но сохранение их и получение их из сеанса) также рассматривается. –

1

В качестве возможного решения вы можете использовать nullable Guid, поэтому значение по умолчанию будет равно null, и вы сможете проверить его с помощью Required.

Решение будет что-то вроде этого:

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

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

Как это помогает предотвратить Guid.Empty? Ключевое требование здесь - убедиться, что мы НЕ разрешаем Guid.Empty. – Sam

Смежные вопросы