раскрывающийся список установить выбранное значение в MVC3 Razor - PullRequest
51 голосов
/ 24 июля 2011

Вот моя модель:

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 не выбирает значение, которое я установил .. Он всегда выбирает первый вариант.

Ответы [ 10 ]

98 голосов
/ 24 июля 2011

Вы должны использовать модели представления и забыть о 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
)
21 голосов
/ 15 февраля 2012

на всякий случай, если кто-то придет с этим вопросом, вот как я это делаю, пожалуйста, забудьте об объекте репозитория, я использую шаблон репозитория, вы можете использовать контекст объекта для извлечения сущностей. И также не обращайте внимания на имена моих сущностей, мой тип сущности Action не имеет ничего общего с MVC Action.

Контроллер:

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> 

Я думаю, это довольно просто, надеюсь, это поможет! :)

9 голосов
/ 04 августа 2016

Я развернул формирование выпадающего списка вместо использования @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>
8 голосов
/ 25 сентября 2012

Ну, в контроллере все очень просто:

- Контроллер

ViewBag.Profile_Id = new SelectList(db.Profiles, "Id", "Name", model.Profile_Id);

- Просмотр (вариант A)

@Html.DropDownList("Profile_Id")

--View (опция B) -> отправить нулевое значение в список

@Html.DropDownList("Profile_Id", null, "-- Choose --", new {  @class = "input-large" })
6 голосов
/ 30 сентября 2015

Замените строку ниже новым обновленным рабочим кодом:

@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID)

Теперь внедрите новый обновленный рабочий код :

@Html.DropDownListFor(model => model.NewsCategoriesID, ViewBag.NewsCategoriesID as List<SelectListItem>, new {name = "NewsCategoriesID", id = "NewsCategoriesID" })
5 голосов
/ 11 октября 2012

Я хочу поставить правильный ответ здесь, на тот случай, если у других возникнет эта проблема, как у меня. Если вы ненавидите ViewBag, хорошо, не используйте его, но реальная проблема с кодом в вопросе заключается в том, что для свойства модели и списка выбора используется одно и то же имя, как было указано @RickAndMSFT

Простое изменение имени элемента управления DropDownList должно решить проблему следующим образом:

@Html.DropDownList("NewsCategoriesSelection", (SelectList)ViewBag.NewsCategoriesID)

Это на самом деле не имеет ничего общего с использованием ViewBag или не использованием ViewBag, поскольку вы можете столкнуться с именем элемента управления независимо от этого.

4 голосов
/ 24 июля 2011

Я предпочитаю лямбда-форму помощника DropDownList - см. Страница макета MVC 3, Шаблон бритвы и DropdownList

Если вы хотите использовать SelectList, то я думаю, что это сообщение об ошибкеможет помочь - http://aspnet.codeplex.com/workitem/4932

2 голосов
/ 07 января 2015

код ниже, получить от , идет

Контроллер:

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. * 1011Имя * Person и @ Html.DropDownList (" Person ") должно быть таким же, как в модели представления

1 голос
/ 10 июня 2014

Чтобы выбрать отдел ИТ при загрузке отделов из таблицы tblDepartment, используйте следующий перегруженный конструктор класса SelectList. Обратите внимание, что мы передаем значение 1 для параметра selectedValue.

ViewBag.Departments = new SelectList(db.Departments, "Id", "Name", "1");
0 голосов
/ 22 марта 2019

Для тех, кто не хочет или не имеет смысла использовать dropdownlistfor, вот как я это сделал в jQuery с настройкой .NET MVC.

  1. Внешний интерфейс Javascript -> получение данных из модели:
    var settings = @Html.Raw(Json.Encode(Model.GlobalSetting.NotificationFrequencySettings)); 

    SelectNotificationSettings(settings);

    function SelectNotificationSettings(settings) {
                $.each(settings, function (i, value) {
                    $("#" + value.NotificationItemTypeId + " option[value=" + value.NotificationFrequencyTypeId + "]").prop("selected", true);
                });
    }
В бритвенном html у вас будет несколько выпадающих списков
 @Html.DropDownList(NotificationItemTypeEnum.GenerateSubscriptionNotification.ToString,
    notificationFrequencyOptions, optionLabel:=DbRes.T("Default", "CommonLabels"),
    htmlAttributes:=New With {.class = "form-control notification-item-type", .id = Convert.ToInt32(NotificationItemTypeEnum.GenerateSubscriptionNotification)})

А при загрузке страницы ваша функция js установит выбранный параметр на основе значения, хранящегося в @ model.

Приветствия.

...