Подтвердить что ты не робот

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

Можно ли подумать, что невозможно установить выбранное значение в классе CLE SelectList после его создания? Разве это не глупо?

4b9b3361

Ответ 1

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

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

Лучшим решением было бы получить ваши данные в List<T> и затем инициализировать SelectList (ы), когда вам нужно. Непосредственная польза от этой практики заключается в том, что она позволяет повторно использовать 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).

Ответ 2

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

Если вы используете строго типизированный вид (т.е. модель имеет назначенный тип), выделенное значение, предоставленное конструктору 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 в списке.

Ответ 3

Я знаю, что это старый вопрос, но он может помочь кому-то там. Я сделал то, что было похоже на то, что сделал Эрик. Я только что создал новый 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);
}

Ответ 4

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

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

Ответ 5

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

ViewData [ "StateCode" ] = "VT";

Похоже, что HTML-помощник выпадающего списка ищет элемент ViewData с тем же именем, что и создаваемый выпадающий список.

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

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

Ответ 6

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

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

Ответ 7

Объект 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>

Ответ 8

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

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

Ответ 9

Мне понадобилось выпадающее меню в редактируемой сетке с предварительно выбранными значениями выпадающего списка. Afaik, данные списка выбора предоставляются контроллером для представления, поэтому он создается до того, как его потребляет. Когда представление потребляет 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));
}

Ответ 10

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

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

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