MVC DropDownListДля выбора значения из модели - программирование
Подтвердить что ты не робот

MVC DropDownListДля выбора значения из модели

Я прочитал этот вопрос ASP.NET MVC DropDownListДля выбора значения из модели и ответа, но я не знаю решения моей проблемы.

Это мое мнение:

@foreach (var adjusterLanguages in Model.adjusterLanguages)
{
    <div class="editor-field row">
        @Html.DropDownListFor(model => Model.adjusterLanguages[i].languageID,
                              (SelectList)ViewBag.ForeignLanguages) 
        @Html.ValidationMessageFor(model =>Model.adjusterLanguages[i].languageID)
    </div>

    <div style="clear: left;"></div>

    i++;
}

Я могу подтвердить, что данные модели заполняются (из моего контроллера):

model.adjusterLanguages = adjLangs;

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

Сгенерированный html выглядит следующим образом:

<div class="editor-field row">
    <select id="adjusterLanguages_0__languageID" name="adjusterLanguages[0].languageID"><option value="">--Select--
        </option>
        <option value="94c5be88-814e-4719-9784-587eb88aa975">Afrikanns</option>
        <option value="37b7bf71-7f4e-47c2-8b81-652b0d63dbcb">Albanian</option>
        <option value="c94d6d85-0ba2-47d7-932e-2a61feba37b3">Arabic</option>
        <!-- ... truncated for brevity ... -->
    </select> 
    <span class="field-validation-valid" data-valmsg-for="adjusterLanguages[0].languageID" data-valmsg-replace="true"></span>
</div>
<div style="clear: left;"></div>
<div class="editor-field row">
     <select id="adjusterLanguages_1__languageID" name="adjusterLanguages[1].languageID">
          <option value="">--Select--</option>
          <option value="94c5be88-814e-4719-9784-587eb88aa975">Afrikanns</option>
          <option value="37b7bf71-7f4e-47c2-8b81-652b0d63dbcb">Albanian</option>
          <option value="c94d6d85-0ba2-47d7-932e-2a61feba37b3">Arabic</option>
          <!-- ... truncated for brevity ... -->
     </select> 
     <span class="field-validation-valid" data-valmsg-for="adjusterLanguages[1].languageID" data-valmsg-replace="true"></span>
</div>
4b9b3361

Ответ 1

Я нашел ответ! Спасибо всем за вашу помощь. Когда я меняю свой код на следующий, он работает. Код просто указывает выбранное значение:

@Html.DropDownListFor(
   model => Model.adjusterLanguages[i].languageID, 
   new SelectList(
       ViewBag.ForeignLanguages, "Value", "Text", 
       @Model.adjusterLanguages[i].languageID)) 

Ответ 2

Когда вы заполняете ViewBag.ForeignLanguages в контроллере, в элементе, который должен быть выбран, установите для свойства .Selected значение true.

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

Вам нужно создать один список для каждого adjusterLanguages в вашем списке. Они не могут использовать один и тот же список, потому что для adjusterLanguages[0] требуется другой элемент, отличный от adjusterLanaguages[1]

Edit:

Мне нравится эта модель:

public class AdjusterLanguageModel
{
  public Guid LanguageId { get; set; }
  List<SelectListItem> ForeignLanguages{ get; set; }
}

public class AdjusterListModel
{
  public List<AdjusterLanguageModel> AdjusterLanguages { get; set }
}

В контроллере вы заполняете свой список идентификатором и собственным списком доступных языков.

На ваш взгляд:

@foreach (var adjusterLanguages in Model.AdjusterLanguages)
{
    <div class="editor-field row">
        @Html.DropDownListFor(model => adjusterLanguages[i].LanguageID,
          adjusterLanguages[i].ForeignLanguages) 
        @Html.ValidationMessageFor(model => adjusterLanguages[i].LanguageID)
    </div>

    <div style="clear: left;"></div>

    i++;
}

Итак, каждый DropDownListFor получает собственный список языков.

Ответ 3

По моему мнению, один элемент ViewBag.ForeignLanguages должен иметь свойство Selected, установленное на true. DropDownListFor метод выбирает элемент на основе ModelState. Здесь у вас есть исходный код метода DropDownListFor и есть что-то вроде:

object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName, typeof(string[])) : htmlHelper.GetModelStateValue(fullName, typeof(string));

И если это значение равно null, то выбранное значение извлекается из Selected property

Ответ 4

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

Ответ 5

Я добавил метод расширения для принудительного выбора значения. Он также сохраняет данные состояния отображения при перезагрузке страницы.

public static class SelectListExtensions
{
    public static SelectList SelectValue(this SelectList selectList, object value)
    {
        return new SelectList(selectList, "Value", "Text", value);
    }
}

Использование:

selectList = selectList.SelectValue(someValue);

Ответ 6

Я отправляю IEnumerable в SList вместо ViewBag

@Html.DropDownListFor(model => Model.list[i].Id, new SelectList(Model.SList, "Value", "Text", Model.list[i].Id), htmlAttributes: new { @class = "form-control" })