Dropdownlist задает выбранное значение в MVC3 Razor
Вот моя модель:
public class NewsCategoriesModel {
public int NewsCategoriesID { get; set; }
public string NewsCategoriesName { get; set; }
}
Мой контроллер:
public ActionResult NewsEdit(int ID, dms_New dsn) {
dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault();
var categories = (from b in dc.dms_NewsCategories select b).ToList();
var selectedValue = dsn.NewsCategoriesID;
SelectList ListCategories = new SelectList(categories, "NewsCategoriesID", "NewsCategoriesName",selectedValue);
// ViewBag.NewsCategoriesID = new SelectList(categories as IEnumerable<dms_NewsCategory>, "NewsCategoriesID", "NewsCategoriesName", dsn.NewsCategoriesID);
ViewBag.NewsCategoriesID = ListCategories;
return View(dsn);
}
И затем мое мнение:
@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID)
Когда я запускаю, DropDownList
не выбирает значение, которое я устанавливаю. Он всегда выбирает первый вариант.
Ответы
Ответ 1
Вы должны использовать модели просмотра и забыть о ViewBag
Подумайте об этом, как будто этого не было. Вы увидите, как все станет проще. Поэтому определите модель представления:
public class MyViewModel
{
public int SelectedCategoryId { get; set; }
public IEnumerable<SelectListItem> Categories { get; set; }
}
а затем заполнить эту модель представления с контроллера:
public ActionResult NewsEdit(int ID, dms_New dsn)
{
var dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault();
var categories = (from b in dc.dms_NewsCategories select b).ToList();
var model = new MyViewModel
{
SelectedCategoryId = dsn.NewsCategoriesID,
Categories = categories.Select(x => new SelectListItem
{
Value = x.NewsCategoriesID.ToString(),
Text = x.NewsCategoriesName
})
};
return View(model);
}
и, наконец, в вашем представлении используйте строго типизированный помощник DropDownListFor
:
@model MyViewModel
@Html.DropDownListFor(
x => x.SelectedCategoryId,
Model.Categories
)
Ответ 2
на всякий случай кто-то приходит с этим вопросом, так я это делаю, пожалуйста, забудьте о объекте репозитория, я использую шаблон репозитория, вы можете использовать свой контекст объекта для извлечения объектов. А также не обращайте внимания на мои имена сущностей, мой тип объекта Действие не имеет ничего общего с действием MVC.
Контроллер:
ViewBag.ActionStatusId = new SelectList(repository.GetAll<ActionStatus>(), "ActionStatusId", "Name", myAction.ActionStatusId);
Обратите внимание, что последней переменной конструктора SelectList является выбранное значение (object selectedValue)
Тогда это мое представление, чтобы сделать это:
<div class="editor-label">
@Html.LabelFor(model => model.ActionStatusId, "ActionStatus")
</div>
<div class="editor-field">
@Html.DropDownList("ActionStatusId")
@Html.ValidationMessageFor(model => model.ActionStatusId)
</div>
Я думаю, что это довольно просто, надеюсь, это поможет!:)
Ответ 3
Ну его очень просто в контроллере у вас есть что-то вроде этого:
- Контроллер
ViewBag.Profile_Id = new SelectList(db.Profiles, "Id", "Name", model.Profile_Id);
- Вид (вариант A)
@Html.DropDownList("Profile_Id")
- Вид (Вариант B) → Отправить нулевое значение в список
@Html.DropDownList("Profile_Id", null, "-- Choose --", new { @class = "input-large" })
Ответ 4
Замените ниже строку новым обновленным рабочим кодом:
@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID)
Теперь выполните новый обновленный рабочий код:
@Html.DropDownListFor(model => model.NewsCategoriesID, ViewBag.NewsCategoriesID as List<SelectListItem>, new {name = "NewsCategoriesID", id = "NewsCategoriesID" })
Ответ 5
Я хочу привести правильный ответ здесь, на случай, если у других возникнут такие проблемы, как я. Если вы ненавидите ViewBag, не используйте его, но реальная проблема с кодом в вопросе заключается в том, что одно и то же имя используется как для свойства модели, так и для selectlist, как было указано @RickAndMSFT
Простое изменение имени элемента управления DropDownList должно решить проблему, например:
@Html.DropDownList("NewsCategoriesSelection", (SelectList)ViewBag.NewsCategoriesID)
На самом деле это не имеет никакого отношения к использованию ViewBag или не использует ViewBag, поскольку вы можете столкнуться с конфликтом имен с элементом управления независимо.
Ответ 6
Я развернул формирование выпадающего списка вместо @Html.DropDownList()
. Это полезно, если вам нужно установить значение раскрывающегося списка во время выполнения в бритве вместо контроллера:
<select id="NewsCategoriesID" name="NewsCategoriesID">
@foreach (SelectListItem option in ViewBag.NewsCategoriesID)
{
<option value="@option.Value" @(option.Value == ViewBag.ValueToSet ? "selected='selected'" : "")>@option.Text</option>
}
</select>
Ответ 7
Я предпочитаю лямбда-форму помощника DropDownList - см. Страница макета MVC 3, шаблон Razor и DropdownList
Если вы хотите использовать SelectList, я думаю, что этот отчет об ошибке может помочь - http://aspnet.codeplex.com/workitem/4932
Ответ 8
ниже, перейти от, идет
Контроллер:
int DefaultId = 1;
ViewBag.Person = db.XXXX
.ToList()
.Select(x => new SelectListItem {
Value = x.Id.ToString(),
Text = x.Name,
Selected = (x.Id == DefaultId)
});
Вид:
@Html.DropDownList("Person")
Примечание:
ViewBag. Лицо и @Html.DropDownList( " Лицо" ) должно быть таким, как в модели просмотра
Ответ 9
Чтобы выбран ИТ-отдел, когда отделы загружены из таблицы tblDepartment, используйте следующий перегруженный конструктор класса SelectList. Обратите внимание, что мы передаем значение 1 для параметра selectedValue.
ViewBag.Departments = new SelectList(db.Departments, "Id", "Name", "1");