Установить выбранное значение в SelectList после создания экземпляра

правильно ли я думаю, что нет способа установить выбранное значение в списке выбора класса C# после его создания? Разве это не глупо?

10 ответов


я думаю, что вы боретесь с рамками. Данные, поступающие в ваши представления, должны быть созданы в последнюю минуту (LPM).

думая таким образом, a SelectList - Это тип подачи DropDownList HTML помощник. Это не место для хранения данных, пока вы решаете, как их обрабатывать.

лучшим решением было бы получить ваши данные в List<T> а затем инициализируйте SelectList(s) когда вам нужно. Непосредственным преимуществом этой практики является то, что она позволяет вам для использования List<T> для более чем одного DropDownList, например:

Country of birth
Country of residence

эти SelectLists все используют список стран типа List<Country>.

можно использовать List<T> в "последнюю минуту", как в этом примере:

public class TaxCheatsFormViewModel
{
    private List<Country> countries { get; set; }

    public TaxCheat Cheat { get; private set; }
    public SelectList CountryOfBirth { get; private set; }
    public SelectList CountryOfResidence { get; private set; }
    public SelectList CountryOfDomicile { get; private set; }

    public TaxCheatsFormViewModel(TaxCheat baddie)
    {
        TaxCheat = baddie;
        countries = TaxCheatRepository.GetList<Country>();
        CountryOfBirth = new SelectList(countries, baddie.COB);
        CountryOfResidence = new SelectList(countries, baddie.COR);
        CountryOfDomicile = new SelectList(countries, baddie.COD);
    }
}

дело в том, что вы должны сохранить ваши данные в List<T> пока вам действительно не нужно вывести его; последняя возможная минута (LPM).


потому что это такой высокий результат в Google, я предоставляю то ,что я нашел для работы здесь (несмотря на возраст):

Если вы используете строго типизированное представление (т. е. модель имеет назначенный тип), SelectedValue, предоставленное конструктору SelectList, перезаписывается значением объекта, используемого для модели страницы.

это хорошо работает на странице редактирования, но не для Create, когда вы хотите предварительно выбрать определенное значение, поэтому одним обходным путем является просто назначьте правильное значение построенному по умолчанию объекту, который вы передаете в представление в качестве модели. например,

var model = new SubjectViewModel()
{
   Subject = new Subject(),
   Types = data.SubjectTypes.ToList()
}
model.Subject.SubjectType = model.Types.FirstOrDefault(t => t.Id == typeId);
ViewData.Model = model;
return View();

Итак, код в моем представлении Create выглядит следующим образом:

Html.DropDownListFor(model => model.Subject.SubjectTypeId, new SelectList(model.Types, "Id", "Name"))

возвращает выпадающий список со значением, которое я назначил как SelectedValue в списке.


Я знаю, это старый вопрос, но это может помочь кому-то там. Я сделал то, что похоже на то, что сделал Эрик. Я только что создал новый SelectList из моего существующего...

SelectList myList = GetMySelectList();
SelectListItem selected = myList.FirstOrDefault(x => x.Text.ToUpper().Contains("UNITED STATES"));
if (selected != null)
{
     myList = new SelectList(myList, "value", "text", selected.Value);
}

свойство "SelectedValue" доступно только для чтения. Установка его в конструкторе-единственный способ.

Tor, список выбора ASP.NET конструкция MVC используется для создания раскрывающегося списка. Делать это по-своему тоже должно работать, но SelectList должен сделать это за вас (а не в JS), если сделано правильно.


Я думаю, что вы можете сделать это в контроллере. Если вы собираетесь отобразить выпадающий список с именем/ID StateCode, вы можете установить выбранное состояние с помощью этого кода после создания списка выбора:

ViewData ["StateCode"] = "VT";

кажется, что выпадающий список HTML helper ищет элемент ViewData с тем же именем, что и выпадающий список, который создается.

Я не думаю, что мне нравится использовать эту технику, но мне кажется, что работа.

Я согласен, что класс SelectList немного слаб на данный момент. Я хотел бы иметь возможность создать SelectList, а затем выбрать значение позже по значению или тексту.


Вы имеете в виду на стороне клиента, в браузере?

var select = document.getElementById('mySelect');
select.options[newIndex].selected = true;

объект SelectList считывается только после его создания. если вы хотите выбрать что-то лучше сделать это так:

<%= Html.DropDownList("clientId", ViewData["clients"] as List<SelectListItem>,)%>

и в коде:

    ViewData["clientId"] = "ASD"; //This should be the value of item you want to select
    ViewData["clients"] = clientItemList; //List<SelectListItem>

может сделать это довольно легко с jQuery;

$(function() {
    $("#myselectlist option[@value='ItemToSelectValue'].attr('selected', 'true');
});

Мне нужен был раскрывающийся список в редактируемой сетке с предварительно выбранными значениями раскрывающегося списка. Afaik, данные selectlist предоставляются контроллером представлению, поэтому он создается до того, как представление его потребляет. Как только представление потребляет SelectList, я передаю его пользовательскому помощнику, который использует стандартный помощник DropDownList. Итак, довольно легкое решение imo. Думаю, это вписывается в ASP.Net MVC дух на момент написания; когда не счастлив свернуть свой собственный...

public static string DropDownListEx(this HtmlHelper helper, string name, SelectList selectList, object selectedValue)
{
    return helper.DropDownList(name, new SelectList(selectList.Items, selectList.DataValueField, selectList.DataTextField, selectedValue));
}

Я согласен с @awrigley и другими, что лучше загрузить выбранное значение с помощью конструктора selectlist в обычном случае, когда у вас есть один dropdownlist. Однако иногда необходимо установить выбранное значение в представлении, например, когда у вас есть страница с N одинаковыми раскрывающимися списками. Поскольку нецелесообразно создавать такие коллекции в контроллере и может даже не знать заранее, сколько выпадающих списков вам нужно, лучшим подходом является создание одного экземпляра в viewmodel как шаблон без выбранного набора значений, а затем динамически создавать остальные динамически в представлении.

Я часто сталкиваюсь с этим при итерации по списку дочерних элементов в представлениях редактирования, когда детям нужны раскрывающиеся списки. В таких случаях вы можете сделать это с помощью одной строки кода:

@Html.DropDownListFor(x => myViewModelFieldName, new SelectList(Model.MyRawSelectListFromMyViewModel.Select(x=> new {x.Value, x.Text}), "Value", "Text", TheValueYouWantToSelect))