DropDownListFor не получает выбранный элемент в представлении, но в модели представления - PullRequest
3 голосов
/ 30 августа 2011

Я использую помощника для выпадающего списка на мой взгляд, как это:

 @Html.DropDownListFor(m => m.BasePlayerForm.Position, Model.GetPositions())

У меня в модели есть функция для заполнения списка:

 public IEnumerable<SelectListItem> GetPositions()
    {
        foreach (string positionValue in Enum.GetNames(typeof(PlayerPosition)))
        {
            var selectListItem = new SelectListItem();
            selectListItem.Text = positionValue;
            selectListItem.Value = ((int)Enum.Parse(typeof(PlayerPosition), positionValue)).ToString();
            if (BasePlayerForm.Position.ToString() == positionValue)
                selectListItem.Selected = true;

            yield return selectListItem;
        }
    }

(Я знаю, что есть и более короткая версия для возврата элемента списка, но для целей отладки я нашел это более полезным.) Самое смешное, если я поставлю точку торможения на "selectListItem.Selected = true;" строка, отладчик попадает в него, но когда я рендерим представление, не выбрана ни одна опция. Я также использую другой dropdownlist для помощника в моем представлении таким же образом, чтобы заполнить раскрывающийся список, но этот получает выбранный элемент. Я действительно не знаю, в чем проблема с этим. Если кто-нибудь знает, пожалуйста, дайте мне знать, я был бы очень признателен =)

Ответы [ 2 ]

2 голосов
/ 31 августа 2011

При использовании строго типизированных Html-помощников, которые принимают IEnumerable из SelectListItem в качестве параметра, выбранное свойство этих элементов игнорируется.

Когда вы устанавливаете значение SelectListItem в вашем методе GetPositions (), вы приводите перечисление PlayerPosition в int. Я предполагаю, что свойство BasePlayerForm.Position в вашей модели представления не является int. Если вы измените BasePlayerForm.Position на int, выбранный элемент должен быть установлен на основе этого свойства.

0 голосов
/ 30 августа 2011

Вы можете вместо использования функции использовать этот код внутри свойства:

public IEnumerable<SelectListItem> ChangeMyName {  
get {  
foreach (string positionValue in Enum.GetNames(typeof(PlayerPosition)))
    {
        var selectListItem = new SelectListItem();
        selectListItem.Text = positionValue;
        selectListItem.Value = ((int)Enum.Parse(typeof(PlayerPosition), positionValue)).ToString();
        if (BasePlayerForm.Position.ToString() == positionValue)
            selectListItem.Selected = true;

        ChangeMyName.Add(selectListItem);
    }
set{return;}  
}  

Тогда вы можете назвать это так:

@Html.DropDownListFor(m => m.BasePlayerForm.Position,new SelectList( Model.GetPositions)  

Я не уверен, поможет ли это, но я бы попробовал.

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