Как правильно установить выбранный элемент в представлении cshtml?

#c# #asp.net-mvc #razor

Вопрос:

У меня это SelectList определено в моей модели просмотра:

 public SelectList AccomodationTypesTypes()
{
    return new SelectList(AccomodationTypes.Select(a => a.Type), "B"); 
}
 

AccomodationTypes.Select(a => a.Type) в IENumerable<string> настоящее время состоит из «А», «В» и «С».
Согласно https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.rendering.selectlist.-ctor вы можете указать второй параметр для указания выбранного значения — в моем случае жестко закодированное «B», — но это не работает.

Если это вам поможет, это фрагмент представления, в котором SelectList :

 <div class="form-group row">
    <label asp-for="Accomodation.AccomodationTypeId" class="col-sm-2 col-form-label">Type</label>
    <div class="col-sm-10"><select asp-for="Accomodation.AccomodationTypeId" asp-items="Model.AccomodationTypesTypes()"></select></div>
</div>
 

В представлении отображаются характеристики конкретного выбранного помещения. AccomodationTypeId-это внешний ключ класса AccomodationType, который обозначает более общие характеристики. В представлении пользователь может выбрать другой тип размещения для текущего размещения. Когда представление отображается на экране, я ожидаю, что будет выбран тип «B», которого в настоящее время нет. Как я могу этого добиться?

Комментарии:

1. У вас много ошибок в этом коде, вот почему он работает неправильно.

2. Хм, да, здесь много всего. Я думаю, что при использовании asp-for вам нужно установить Accomodation.AccomodationTypeId любое значение «B», которое должно быть в вашем выборе, но поскольку вы не устанавливаете значения для выбранного вами, это может быть сложно. Не могли бы вы попробовать добавить изображение вашего отрисованного html (так что не код cshtml)?

3. @Serge Нет, я не согласен: мне нужно было изменить только одну строку, см. Мой ответ. И еще в мою защиту: в упомянутой мной статье Microsoft говорится, что в качестве второго параметра должно быть указано «SelectedValue». «B» идеально подходит в качестве значения, которое можно выбрать.

4. @Cooz Это будет работать, но это не лучший способ сделать это. Извините, но мне интересно, раз вы сами отвечаете на свои вопросы, почему вы публикуете эти вопросы?

5. @Serge Ну, я, конечно, не единственный, кто это делает — люди сами отвечают на свои вопросы по всему переполнению стека. Может быть, вспышка озарения? Наконец-то после поисков в течение дня нашли статью, которая дала такое представление? Веские причины для меня. Я новичок и все еще учусь, а ты, очевидно, намного дальше этого. Но тогда, каков наилучший способ сделать это, и что не так с тем, что я придумал?


Ответ №1:

Я разработал это, используя другую перегрузку списка выбора:

 public SelectList AccomodationTypesTypes()
{
     return new SelectList(AccomodationTypes, "Id", "Type");
}
 

"Id" связывается с asp-for ( Accomodation.AccomodationTypeId ) в представлении, и соответствующий "Type" отображается в списке выбора. Делает свое дело.

Я пошел в неправильном направлении, потому return new SelectList(AccomodationTypes.Select(a => a.Type)) что уже дал мне раскрывающийся список, который я хотел, и в соответствии со статьей Microsoft, которую я связал, мне нужно было только указать второй параметр для установления выбранного значения («Id», вероятно, вместо «B» 🙂).