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



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

583   10  

10 ответов:

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

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

Лучшим решением было бы получить ваши данные в 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).

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

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

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, я передаю его пользовательскому помощнику, который использует стандартный dropdownlist helper. Итак, довольно легкое решение ИМО. Думаю, это вписывается в 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))

Comments

    Ничего не найдено.