Установить выбранное значение в SelectList после создания - PullRequest
31 голосов
/ 19 ноября 2008

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

Ответы [ 10 ]

19 голосов
/ 12 февраля 2010

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

С этой точки зрения 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).

4 голосов
/ 05 сентября 2012

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

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

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

Это хорошо работает на странице редактирования, но не для 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();

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

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

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

3 голосов
/ 19 ноября 2008

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

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

1 голос
/ 01 февраля 2009

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

ViewData ["StateCode"] = "VT";

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

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

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

0 голосов
/ 10 апреля 2013

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

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

@Html.DropDownListFor(x => myViewModelFieldName, new SelectList(Model.MyRawSelectListFromMyViewModel.Select(x=> new {x.Value, x.Text}), "Value", "Text", TheValueYouWantToSelect))
0 голосов
/ 08 ноября 2009

Мне нужен был выпадающий список в редактируемой сетке с предварительно выбранными значениями. На самом деле, данные списка выбора предоставляются контроллером для представления, поэтому они создаются до того, как представление использует их. Как только представление использует SelectList, я передаю его специальному помощнику, который использует стандартный помощник DropDownList. Итак, довольно легкое решение ИМО. Думаю, это соответствует духу 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));
}
0 голосов
/ 27 августа 2009

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

$(function() {
    $("#myselectlist option[@value='ItemToSelectValue'].attr('selected', 'true');
});
0 голосов
/ 12 марта 2009

Объект 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>
0 голосов
/ 19 ноября 2008

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

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