2013-04-17 6 views
3

Кажется, этот вопрос задавался слишком много раз. Но это сводит меня с ума.Выбранное значение, не заданное в DropDownListFor() в MVC4

Это моя (упрощенная) модель.

public class UserEditModel 
{ 
    [Required] 
    public string Title { get; set; } 

    private IEnumerable<SelectListItem> _titleList; 
    public IEnumerable<SelectListItem> TitleList 
    { 
     get { return _titleList.Select(x => new SelectListItem { 
          Selected = (x.Value == Title), 
          Text = x.Text, 
          Value = x.Value 
         }); 
     } 
     set { _titleList = value; } 
    } 
} 

В Text и Value свойства каждого SelectListItem в TitleList элемента идентичны. Например:

new SelectListItem { Text = "Mr", Value = "Mr" } 

Когда следующий код размещен, правильное значение Title привязано к модели, но всякий раз, когда модель проталкиваются к представлению в ответ на POST или GET, выбранное значение не установленный в выпадающем списке, хотя все intellisense показывает, что правильные значения присутствуют.

@Html.DropDownListFor(x => x.Title, Model.TitleList) 

Я убедился, что код верен на основе нескольких статей и нескольких ответов SO, поэтому я в тупике.

Любые предложения?

Update:

Для полноты, это действие и поддерживает метод:

[HttpGet] 
public ActionResult Edit(int id) 
{ 
    var user = _userService.Get(id); 

    var model = new UserEditModel() 
    { 
     ... 
     Title = user.Title, 
     TitleList = ListTitles() 
    }; 

    return View(model); 
} 

private IEnumerable<SelectListItem> ListTitles() 
{ 
    var items = new[] { 
      new SelectListItem() {Text = "Mr", Value = "Mr" }, 
      new SelectListItem() {Text = "Mrs", Value = "Mrs"}, 
      new SelectListItem() {Text = "Ms", Value = "Ms"}, 
      new SelectListItem() {Text = "Miss", Value = "Miss"}, 
      new SelectListItem() {Text = "Professor", Value = "Professor"}, 
      new SelectListItem() {Text = "Dr", Value = "Dr" } 
     }; 

    return items; 
} 

Как вы видите, нет ничего особенного, просто прямой реализации.

+0

Попробуйте добавить 'ModelState.Clear()' непосредственно перед тем, как вы вернете свое представление. – mattytommo

+0

@mattytommo Зачем мне это нужно? Не могли бы вы разместить его в качестве ответа? – Digbyswift

+0

См. Мой ответ, вот почему :) – mattytommo

ответ

2

Ну, похоже, что в коде нет ничего плохого, просто имя свойства Title в модели.

Похоже, что Title является зарезервированным словом и заменяет его TitleX или более подходящим образом Salutation заставляет все работать нормально.

+0

Спасибо, Fella. У меня была такая же проблема - даже использовались те же имена свойств, что и у вас. Просто потратил пару часов, вытаскивая мои волосы из-за этого. Когда мы говорим по-своему: «Что за куска дерьма ...» – kenxl

+0

Такая же проблема здесь должна выловить много людей. Однако у меня теперь есть еще один снимок, не выбрав правильное значение. Я могу видеть значение, установленное в модели в шаблоне, но оно не выбрано. Все остальные выпадающие файлы отлично работают, и я не вижу различий в коде. –

+0

http://stackoverflow.com/questions/2278056/dropdownlistfor-not-selecting-value Исправлено! Я назначил свойство ViewBag с тем же именем, что и свойство модели, которое, по-видимому, является большим. –

2

Вам нужно добавить ModelState.Clear(), потому что по умолчанию при возврате вида из почтового действия, он считает, что он не прошел проверку, поэтому использует значения в ModelState и не значений в модели. Многие люди думают, что это на самом деле ошибка в MVC, но это дизайн:

ASP.NET MVC предполагает, что если вы рендеринг View в ответ на HttpPost, и вы используете Html Помощники, тогда вы, скорее всего, будете перерисовывать форму, которая не прошла проверку. Поэтому помощники Html действительно проверяют ModelState на значение, отображаемое в поле, прежде чем они будут выглядеть в модели. Это позволяет им повторно отображать ошибочные данные, введенные пользователем, и соответствующее сообщение об ошибке, если это необходимо.

Link

+0

Проблема не в POST/ModelState. Выбранное значение не устанавливается ни разу, ни POST, ни GET. Мое упоминание о POST состояло в том, чтобы показать, что модель была настроена правильно, и вряд ли это будет проблемой с моделью. – Digbyswift

+0

Но спасибо за объяснение, это полезно в любом случае. – Digbyswift

+0

@Digbyswift Если вы можете увидеть его в действии, это будет прямо до того, как он ударит по виду, это почти наверняка ** 'ModelState'. Вы пытались добавить «.Clear»? – mattytommo

0

Вы уверены, что получить деталь SelectList надлежащим образом в контроллере? Для меня это нормально работает. Я бы использовал метод get вместо свойства (GetTitleList(string value)), чтобы избежать ошибок в выборе списка выбора в вашем коде.

+0

Независимо от реализации, если код работает для вас, он должен работать на меня, не так ли? И да, как я говорю в OP, все значения верны. Это тайна! – Digbyswift