Выпадающее меню, вызывающее недопустимое состояние модели.ASP.NET MVC 3 - PullRequest
2 голосов
/ 13 марта 2012

У меня есть вид регистрации в моем веб-приложении. Однако регистрация учетной записи будет неудачной, и мое раскрывающееся меню будет выделено красным.

Вот мой выпадающий код:

<div class="editor-label">  
   @Html.LabelFor(model => model.CompanyId, "Company")  
</div>   
<div class="editor-field">  
   @Html.DropDownList("Companies", "<Select Company>")  
</div>

Вот мой связанный код в модели представления:

[Display(Name = "Company")]    
public int? CompanyId { get; set; }

public IEnumerable<SelectListItem> Companies { get; set; }

Вот мой связанный код в контроллере, прежде чем я возвращаю представление:

ViewBag.Companies = new SelectList(db.Companies, "CompanyId", "CompanyName");

Во время отладки я обнаружил, что ModelState.IsValid возвращает false, и, следовательно, повторно возвращает представление (и сбрасывает ViewBag.Companies в моем случае).

Как мне пройти успешную регистрацию? Я заполняю каждое обязательное поле в параметрах. Не обязательно выбирать компанию. Когда я не выбираю компанию, ModelState.IsValid возвращает значение true и проходит через код. Однако я хотел бы, чтобы у пользователя была возможность связаться с его компанией.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Зачем вам нужно устанавливать ViewBag.Companies, когда у вас есть лучший подход - наличие списка выбора в модели? Нет необходимости использовать уродливый ViewBag

У вас должно быть что-то вроде этого

ViewModel

public class RegisterViewModel
{
     [Display(Name = "Company")]    
     public int? CompanyId { get; set; }

     public IEnumerable<SelectListItem> Companies { get; set; }
}

Контроллер

[HttpGet]
public ActionResult Register()
{
     RegisterViewModel viewModel = new RegisterViewModel();
     viewModel.Companies = new SelectList(db.Companies, "CompanyId", "CompanyName");

     return View(viewModel);
}

А на виду

<div class="editor-label">  
   @Html.LabelFor(model => model.CompanyId, "Company")  
</div>   
<div class="editor-field">  
   @Html.DropDownListFor(model => model.CompanyId, Model.Companies, "<Select Company>")  
</div>

Это правильно свяжет ваш CompanyId на сервере.

0 голосов
/ 06 января 2017

Состояние вашей модели всегда будет недействительным для выпадающих меню, если выбранный вами тип переменной не является строкой.Измените CompanyId на строку.Вы все еще можете использовать IEnumerable Companies {get; set;}

0 голосов
/ 13 марта 2012

DropDownList довольно странный в ASP.Net MVC3. не будет правильно привязываться к перечисляемому SelectListItem.Вам необходимо сохранить связанный выбранный выбор для примитива в модели и список всех параметров в отдельном поле.

<div class="editor-label">  
   @Html.LabelFor(model => model.CompanyId, "Company")  
</div>   
<div class="editor-field">  
   @Html.DropDownListFor(model => model.CompanyId, new SelectList(Model.Companies))  
</div>

Затем в вашей модели измените IEnumerable of SelectListItems на IEnumerable ofstrings.

[Display(Name = "Company")]    
public string CompanyId { get; set; }

public IEnumerable<string> Companies { get; set; }

Наконец, в вашем контроллере,

ViewBag.Companies = db.Companies;

Так же, как sidenote, я предлагаю вместо этого сделать ваш IEnumerable IList.Раскрывающееся меню определенно заботится о порядке представления данных, поэтому ваша модель должна это отражать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...