2016-11-01 2 views
2

У меня есть свойство перечислимого, что я использую для заполнения раскрывающегося списка, как часть моей формы, которая выглядит следующим образом:Проверка на нуль в перечислениях собственности

public class MyModel 
{ 
    [Required] 
    [DisplayName("Type of Enum")] 
    public EnumType? Type { get; set; } 
} 

public enum EnumType 
{ 
    option1 = 1, 
    option2 = 2, 
    option3 = 3, 
    option4 = 4 
} 

Форма отправляет к другому контроллеру, где Я пытаюсь проверить нуль в перечислимого типа:

public class ResultController : Controller 
{ 
    // GET: Result 
    [AllowAnonymous] 
    public ActionResult Index(MyModel model) 
    { 
     if(!Enum.IsDefined(typeof(MyEnum), model.EnumType)) 
     { 
      return RedirectToAction("Index", "Home"); 
     }   
     return View(); 
    } 
} 

когда я пытаюсь ..../result?Type=5RedirectToAction работает, но когда я пытаюсь ..../result?Type= я получаю ArgumentNullException.

Примечание: добавление None=0 в Enum не является вариантом для меня, я не хочу, чтобы в раскрывающемся списке ничего не отображалось.

Как я могу проверить значение null в контроллере? Существует ли наилучшая практика в этом отношении?

+0

это должно быть 'HasValue'? Поскольку 'Type' является' nullable' – Prisoner

ответ

2

Во-первых, на основе вашей модели требуется Type свойство.

public class MyModel 
{ 
    [Required] 
    [DisplayName("Type of Enum")] 
    public EnumType? Type { get; set; } 
} 

Во-вторых, вам нужно проверить, что значение перечисления действительно определяется на EnumType декларации, то вам не нужно вызывать Enum.isDefined метод в действии. Просто украсьте свой объект Type атрибутом аннотации данных EnumDataType(typeof(EnumType)), который будет выполнять эту работу. Так что ваша модель будет выглядеть следующим образом:

public class MyModel 
{ 
    [Required] 
    [EnumDataType(typeof(EnumType))] 
    [DisplayName("Type of Enum")] 
    public EnumType? Type { get; set; } 
} 

Наконец, в своем действии контроллера просто очистить его так, чтобы выглядеть следующим образом:

// GET: Result 
[AllowAnonymous] 
public ActionResult Index(MyModel model) 
{ 
    // IsValid will check that the Type property is setted and will exectue 
    // the data annotation attribute EnumDataType which check that 
    // the enum value is correct. 
    if (!ModelState.IsValid) 
    { 
     return RedirectToAction("Index", "Home"); 
    } 
    return View(); 
} 
+0

Да, это сработало для меня. Благодарю. – hello

3

Обязательно проверьте значение null перед использованием в IsDefined().

public ActionResult Index(MyModel model) 
{ 
    if(!model.EnumType.HasValue) 
    { 
     return RedirectToAction("Index", "Home"); 
    }   
    if(!Enum.IsDefined(typeof(MyEnum), model.EnumType)) 
    { 
     return RedirectToAction("Index", "Home"); 
    }   
    return View(); 
} 

Сокращенный вариант заключается в использовании null-coalesce operator использовать 0 вместо null в вызове IsDefined():

public ActionResult Index(MyModel model) 
{ 
    if(!Enum.IsDefined(typeof(MyEnum), model.EnumType ?? 0)) 
    { 
     return RedirectToAction("Index", "Home"); 
    }   
    return View(); 
} 
Смежные вопросы