У меня есть action
, который извлекает данные и отправляет их на view
. В представлении у меня есть два раскрывающихся меню.Html.DropDownListFor не выбирает значение
Первый снимок показывает приветствие (например, «г-н», «г-жа» и т. Д.) И по какой-то причине не выбрал значение, которое я отправил. В другом выпадающем списке отображается список языков и правильно выбирается значение, которое я отправил на просмотр. Ниже представлен соответствующий код.
@Html.DropDownListFor(model => model.Salutation, ViewBag.salutation as IEnumerable<SelectListItem>)
@Html.DropDownListFor(model => model.Language, ViewBag.languages as IEnumerable<SelectListItem>)
В контроллере у меня есть следующий код, чтобы получить данные выпадающие.
ViewBag.salutation = new List<SelectListItem>() {
new SelectListItem() { Text = "", Value = "" },
new SelectListItem() { Text = "Mr.", Value = "Mr." },
new SelectListItem() { Text = "Ms.", Value = "Ms." },
new SelectListItem() { Text = "Mrs.", Value = "Mrs." }
};
и
var languages = (from l in db.Languages.ToList()
select new SelectListItem()
{
Text = l.Language,
Value = l.LanguageId.ToString()
}).ToList();
languages.Insert(0, new SelectListItem() { Text = "", Value = "" });
ViewBag.languages = languages;
Единственное различие, которое я мог думать о том, что языки выпадающий имеет целое число в качестве значения, в то время как приветствием выпадающий имеет текст в качестве значения. Поэтому почему всплывающее окно приветствия не работает? Я знаю, что могу пройти через каждое приветствие List<SelectListItem>
и установить значение Selected
на основе значения, полученного из базы данных. Но я надеялся, что будет более чистый способ сделать это.
Любые идеи?
Благодаря
UPDATE
я решил сделать то, что я сделал для другого проекта.
IList<SelectListItem> _salutation = new List<SelectListItem>()
{
new SelectListItem() { Value = "", Text = "" },
new SelectListItem() { Value = "Mr.", Text = "Mr." },
new SelectListItem() { Value = "Ms.", Text = "Ms." },
new SelectListItem() { Value = "Mrs.", Text = "Mrs." }
};
// I could put the following in the declaration above, but for testing purposes it's in foreach loop.
foreach (var item in _salutation)
{
// compare to what's retrieved from database
item.Selected = item.Value == _viewData.Salutation;
}
ViewBag.salutation = _salutation;
После foreach
петли Выхода I .Value
, .Selected
свойства каждого элемента в _salutation
и я получаю все правильные значения с одним элемента выбран. Внутри представления я сделал следующее.
@foreach (var item in ViewBag.salutation as IEnumerable<SelectListItem>)
{
<b>@item.Value : @item.Text : @item.Selected</b><br />
}
Весь правильный текст/значения появляются, но ни один из них не выбран! Это происходит, если я вывожу значения после выполнения @Html.DropDownListFor()
. Если я вывожу ViewBag.salutation перед html-хелпером, выбирается правильное значение.
РЕШЕНИЕ
Я нашел следующую статью полезной: DropDownListFor with ASP.NET MVC.
Вместо использования ViewBag
Я добавил в ViewModel следующее. (Показывая часть для приветствий выпадающие.)
public class TheViewModel
{
private IList<string> _salutations = new List<string>() { "", "Mr.", "Ms.", "Mrs." };
public IEnumerable<SelectListItem> SalutationItems
{
get
{
var salutations = _salutations.Select(s => new SelectListItem { Value = s, Text= s });
return salutations;
}
}
// The rest of the ViewModel
}
И в View
я следующее.
@Html.DropDownListFor(model => model.Salutation, Model.SalutationItems)
, что вы пытаетесь сделать, я не понял вашу логику, вы ставите выпадающий список моделей а также переходить из viewBag, вы можете просто установить свойство модели приветствия и пропустить модель для просмотра, тогда нет необходимости вставлять ViewBag –
ViewBag содержит данные для выпадающего списка (что может быть много элементы, как это имеет место для языков), и в моей модели у меня есть одно значение для каждого раскрывающегося списка - они поступают из базы данных - и это то, что я хочу выбрать. Одно выпадающее меню работает, а другое нет. – erdinger
что вы пытаетесь сделать, его непонятно для меня, почему вы используете как модель, так и сумку, почему бы и нет? –