0

ok, У меня есть ситуация, когда мне нужно иметь несколько DDL-файлов «BayTypes», которые используют тот же словарь, что не является проблемой. Один DDL для каждого из «n» BayOptions. Я передаю словарь на мой взгляд, как 'BayTypes', как это:MVC/C#: DropDownListДля выбора «selected» item

(контроллер)

var bayTypes = _bayTypeRepository.GetBayTypes().ToList(); 
property.BayTypes = bayTypes.ToDictionary(g => g.Name, g => g.BayTypeGuid.ToString()); 

(Просмотр)

var overrideValue = item.BayTypeOverride ? item.BayTypeOverrideValue.BayTypeGuid.ToString() : string.Empty; 
var result = (from x in Model.BayTypes 
       select new SelectListItem() 
        { 
        Text = x.Key, 
        Value = x.Value, 
        Selected = x.Value == overrideValue <-- ***this is working*** 
        }); 
if (item.BayTypeOverride == true) 
    { 
    @Html.DropDownListFor(x => x.BayTypes, result, new { @Name = "BayOptionsToSubmit[" + aCounter + "].BayTypeOverrideValue" }) 
    } 
    else 
    { 
    @Html.DropDownListFor(x => x.BayTypes, result, new { @Name = "BayOptionsToSubmit[" + aCounter + "].BayTypeOverrideValue", @style = "display:none;" }) 
    } 

Правильная деталь получает выбранные в результате» 'объекта. Если я выйду и посмотрю «результат», я вижу, что «Selected = true» для правильного ... но он не выбирает в DDLFor, когда он отображает ...

Что мне не хватает?

ответ

0

Решено ... Изменено на .DropDownList (нет «For») и передано в «имя» в качестве «результата» var, созданного ранее. Работает.

var overrideValue = item.BayTypeOverride ? item.BayTypeOverrideValue.BayTypeGuid.ToString() : string.Empty; 
var result = (from x in Model.BayTypes 
       select new SelectListItem() 
       { 
       Text = x.Key, 
       Value = x.Value, 
       Selected = x.Value == overrideValue 
       }); 
       if (item.BayTypeOverride) 
       { 
       @Html.DropDownList("result", result, htmlAttributes: new { @Name = "BayOptionsToSubmit[" + aCounter + "].BayTypeOverrideValue" }) 
       } 
       else 
       { 
       @Html.DropDownList("result", result, htmlAttributes: new { @Name = "BayOptionsToSubmit[" + aCounter + "].BayTypeOverrideValue", @style = "display:none;" }) 
           } 
2

В конечном счете, что определяет «выбранный» элемент в раскрывающемся списке - ModelState, а не SelectListItem.Selected. ModelState состоит из следующих источников: Request, ViewData, ViewBag и, наконец, Model.

Проверьте значения Request["BayTypes"], ViewData["BayTypes"], ViewBag.BayTypes и Model.BayTypes. Если какая-либо из них отличается от того, что вы ожидаете выбрать, это ваша проблема, особенно если это значение даже не на стадионе.

Например, общая причина этого заключается в том, что разработчики сохраняют свои фактические выборки выбора в чем-то вроде ViewBag.Foo, а затем пытаются применить это к раскрывающемуся списку до Model.Foo. Сам список выбора в этой точке становится выбранным элементом в ModelState, а не единственным выбранным вами значением.

+0

У меня это работает несколько иначе в другом месте этого решения, используя шаблон Viewbag, описанный выше, но он работает..lol Это не связанное поле. Я перехожу только в словарь, а не в список объектов «BayType», а через Viewmodel я повторно привязываюсь к объектам BayType/BayOptions. Я проверю значения, которые вы предлагаете просмотреть. Хотя вы не упоминаете «исправить». Благодарю. –

+0

«Исправить» зависит от того, что вы найдете. Например, если вы устанавливаете что-то в свойство «ViewBag» с аналогичным именем, вы можете просто изменить имя этого свойства. Однако, если вы получаете что-то из параметра запроса, вам, возможно, придется адаптироваться по-другому. Все это зависит. –

+0

проблема в том, что есть «n» BayOptions, поэтому я не могу установить выбранный в контроллере, он должен быть установлен в представлении на BayOption. –

 Смежные вопросы

  • Нет связанных вопросов^_^