2014-12-19 7 views
2

Я использую приложение MVC4. Ниже моя модельNot Allow drop down null value selected

public class ViewModel 
     { 
public string AssignedUserName { get; set; } 
      public IList<SelectListItem> PossibleAssignees { get; set; } 

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

Вид:

<table style="width: 100%; "> 
     <tr> 
      <td>Assigned To:</td> 
      <td>@Html.DropDownListFor(x => x.AssignedUserName, Model.PossibleAssignees)</td> 
      <td>@Html.ValidationMessageFor(m => m.AssignedUserName, "Assigned To Required")</td> 
<tr></table> 

PossibleAssignes является раскрывающийся, значения должны быть -> EmptyString, "Mr.Barr".

Так что, если пользователь выбрал EmptyString, мне нужно отправить подтверждение, например, «это обязательно».

Я попробовал с добавлением [Обязательно] проверка поля. это коллекция, которая имеет несколько пустых значений строки в качестве значения выпадающего значения, , поэтому я не уверен, как использовать поле [Обязательно] для коллекции, имеющей пустые строки. Я не хочу разрешать пустые строки для выпадающего списка.

как я могу проверить это?

+0

Показать, как вы создаете выпадающее меню, а 'IList ' –

+0

@stephen обновил код представления – SivaRajini

+2

Если вы измените его на '@ Html.DropDownListFor (x => x.AssignedUserName, Model.«Возможные атрибуты», «--Пожалуйста, выберите -») 'он отобразит первый вариант с нулевым значением, которое вызовет ошибку проверки, если выбрано. –

ответ

2

не назначать строку emtpty для значений в вашем списке, использовать ее как значение по умолчанию, а [Required] будет работать нормально. По вашему мнению, как использовать его:

@Html.DropDownListFor(x => x.AssignedUserName, Model.PossibleAssignees, String.Empty) 

и в вашем ViewModel:

public class ViewModel 
{ 
     [Required] 
     public string AssignedUserName { get; set; } 
     public IList<SelectListItem> PossibleAssignees { get; set; } 

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

EDIT (я оставлю мой первый ответ, потому что она может работать на кого-то другого)

Вы можете сделать специальную проверку:

public class ViewModel 
{ 
     [Required] 
     [ValidateAssignedUserName()] 
     public string AssignedUserName { get; set; } 
     public IList<SelectListItem> PossibleAssignees { get; set; } 

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

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)] 
public sealed class ValidateAssignedUserName : ValidationAttribute 
{ 
    private const string _defaultErrorMessage = "Select a user."; 

    public ValidateAssignedUserName() 
     : base(_defaultErrorMessage) 
    { } 

    public override bool IsValid(object value) 
    { 
     string user = value as string; 

     if (user != null && user.Length > 0) 
     { 
      return true; 
     } 

     return false; 
    } 
} 
+0

sorry.i не могу это понять – SivaRajini

+0

что использовать добавление String.Empty для выпадающего списка – SivaRajini

+0

@SivaRajini in PossibleAssignees не включает пустую строку. 'String.Empty' будет работать как значение по умолчанию и проверять, как ничто не выбрало – FabioG

1

В качестве альтернативы, вы можете также использовать пользовательской модели вяжущего .eg

public class ViewModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var model = base.BindModel(controllerContext, bindingContext) as ViewModel; 

     if (model.AssignedUserName == "-1") 
      bindingContext.ModelState.AddModelError("AssignedUserName", "No assignee selected"); 

     return model; 
    } 
} 

Global.asax.cs

protected void Application_Start() 
{ 
    // ..... 
    ModelBinders.Binders.Add(typeof(ViewModel), new ViewModelBinder()); 
    // .... 
} 

немного изменить ваш взгляд:

<td>@Html.ValidationMessageFor(m => m.AssignedUserName)</td>

Вынуть текст из второго параметра для указанной строки.

Выполнение вышеуказанного приведет к тому, что ModelState.IsValid будет установлен в false. Когда вы визуализируете представление, появляется текст «Нет назначенного лица», где вызывается вызов ValidationMessageFor().

Итак, есть варианты для достижения того, что вам нужно.