Управляет ли механизм Razor View выбранным элементом раскрывающегося списка, если значение поля равно нулю? - PullRequest
0 голосов
/ 18 октября 2018

Я надеюсь, что кто-то может объяснить, что происходит с этим.
У меня есть несколько выпадающих списков на моей странице, которые имеют одинаковый набор элементов (null, True, False).я не могу понять, как и почему, когда страница отображается, я вижу, Razor выбирает предыдущий выпадающий элемент, выбранный для текущего, если значение равно нулю.

Вот мой код:

public class DdlViewModel
{
    public bool? Field1 { get; set; }
    public bool? Field2 { get; set; }
    public bool? Field3 { get; set; }
    public bool? Field4 { get; set; }
    public bool? Field5 { get; set; }
    public IEnumerable<SelectListItem> YesNoBlank { get; set; }
}

public ActionResult DDl()
{
    var selectListItems = new List<SelectListItem>
    {
        new SelectListItem {Value = null, Text = ""},
        new SelectListItem {Value = "True", Text = "Yes"},
        new SelectListItem {Value = "False", Text = "No"},
    };

    var viewModel = new DdlViewModel();
    viewModel.Field2 = true;
    viewModel.Field4 = false;
    viewModel.YesNoBlank = selectListItems;

    return View(viewModel);
}

, а вот вид;

<body>
    <div>
        Field 1 @Html.DropDownListFor(b => b.Field1, Model.YesNoBlank)
        <br />
        Field 2 @Html.DropDownListFor(b => b.Field2, Model.YesNoBlank)
        <br />
        Field 3 @Html.DropDownListFor(b => b.Field3, Model.YesNoBlank)
        <br />
        Field 4 @Html.DropDownListFor(b => b.Field4, Model.YesNoBlank)
        <br />
        Field 5 @Html.DropDownListFor(b => b.Field5, Model.YesNoBlank)
    </div>
</body>

- вот результат, который я действительно ожидаю, что поля 3 и 5 будутпусто как для поля 1;

ОБНОВЛЕНИЕ

Согласно ответу Тецуя Ямамото, я изменил свой код, как показано ниже,Это также сделало свое дело.и не требует никаких изменений на мой взгляд.

public class DdlViewModel
{
    ...
    public SelectList YesNoBlank { get; set; }
}

public ActionResult DDl()
{
    var selectListItems = new SelectList(new List<SelectListItem>
    {
        new SelectListItem {Value = null, Text = ""},
        new SelectListItem {Value = "True", Text = "Yes"},
        new SelectListItem {Value = "False", Text = "No"},
    }, "Value", "Text");

    ...
}

1 Ответ

0 голосов
/ 19 октября 2018

Вместо того, чтобы использовать одно и то же Model.YesNoBlank для всех выпадающих меню, вы можете передать нулевое значение, чтобы применить выбранное значение для третьего и пятого DropDownListFor следующим образом:

@Html.DropDownListFor(b => b.Field3, new SelectList(Model.YesNoBlank, "Value", "Text", null))

@Html.DropDownListFor(b => b.Field5, new SelectList(Model.YesNoBlank, "Value", "Text", null))

Обратите внимание, что коллекция IEnumerable<SelectListItem> "запоминает «последний выбранный параметр значения при применении к DropDownListFor (т. е. для этой цели существует свойство Selected ), следовательно, если выбранное значение второго раскрывающегося списка установлено как true, то следующие раскрывающиеся списки используют тот же *Свойство 1012 * будет устанавливаться с тем же значением до тех пор, пока в списке не будет назначено другое значение.

Такое же поведение также существует при использовании цикла foreach для генерации DropDownListFor с тем же свойством IEnumerable<SelectListItem>как элементы списка и содержащие выбранное значение, как описано в , эта проблема .

Короче говоря, свойство Nullable<bool> не очищает выбранное значение из свойства Selected после его установки.,Таким образом, ответ «нет», потому что IEnumerable<SelectListItem> выбранное значение не сбрасывается, даже если явно задано нулевое значение, например, viewModel.Field3 = null.

Пример в реальном времени: .NET Fiddle Demo

Проблема, связанная с данной: MVC Несколько DropDownLists из 1 списка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...