@ Html.DropDownList отображает другой HTML и не возвращается, но по умолчанию - PullRequest
0 голосов
/ 05 мая 2018

Два идентичных оператора @ Html.DropDownList отображают разные HTML. Второй работает нормально, но первый всегда возвращает значение по умолчанию, независимо от того, что было выбрано.

Статистика @ Html.DropDownList представлена ​​в следующем коде:

<div class="form-group">
@Html.LabelFor(model => model.UnidadeId, "Unidade", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
    @Html.DropDownList("UnidadeId", (SelectList)ViewBag.UnddId, htmlAttributes: new { @class = "form-control" })
    @Html.ValidationMessageFor(model => model.UnidadeId, "", new { @class = "text-danger" })
    </div>
</div>

<div class="form-group">
    @Html.LabelFor(model => model.UnidadeConsumoId, "Unidade de Consumo", htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownList("UnidadeConsumoId", (SelectList)ViewBag.UndConsId, htmlAttributes: new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.UnidadeConsumoId, "", new { @class = "text-danger" })
    </div>
</div>

И HTML-код, который он отображает:

<div class="form-group">
<label class="control-label col-md-2" for="UnidadeId">Unidade</label>
<div class="col-md-10">
    <select class="form-control" id="UnidadeId" name="UnidadeId">
        <option value="1">cx</option>
        <option value="2">pc</option>
        <option selected="selected" value="3">kg</option>
        <option value="4">mt</option>
        <option value="5">rl</option>
        <option value="6">ml</option>
        <option value="8">na</option>
        <option value="9">hr</option>
        <option value="10">un</option>
        <option value="11">lt</option>
    </select>
    <span class="field-validation-valid text-danger" data-valmsg-for="UnidadeId" data-valmsg-replace="true"></span>
    </div>
</div>

<div class="form-group">
    <label class="control-label col-md-2" for="UnidadeConsumoId">Unidade de Consumo</label>
    <div class="col-md-10">
    <select class="form-control" data-val="true" data-val-number="The field Unidade de Consumo must be a number." data-val-required="The Unidade de Consumo field is required." id="UnidadeConsumoId" name="UnidadeConsumoId">
        <option value="1">cx</option>
        <option value="2">pc</option>
        <option value="3">kg</option>
        <option value="4">mt</option>
        <option value="5">rl</option>
        <option value="6">ml</option>
        <option value="8">na</option>
        <option value="9">hr</option>
        <option selected="selected" value="10">un</option>
        <option value="11">lt</option>
    </select>
        <span class="field-validation-valid text-danger" data-valmsg-for="UnidadeConsumoId" data-valmsg-replace="true"></span>
    </div>
</div>

Чтобы хранить всю информацию вместе, список генерируется:

ViewBag.UnddId = new SelectList(db.Unidades, "UnidadeId", "Apelido", insumo.UnidadeId);
ViewBag.UndConsId = new SelectList(db.Unidades, "UnidadeId", "Apelido", insumo.UnidadeConsumoId);

Где Unidade:

public class Unidade
{
    public int UnidadeId { get; set; }
    public string Apelido { get; set; }
    public string Descricao { get; set; }
}

Как видно, оператор "select" отличается, как и результаты. Первый выпадающий список возвращает только значение по умолчанию, а второе возвращает выбранное значение ... Я не могу понять, что происходит ... Заранее спасибо!

GET-код:

public ActionResult Edit(int? id)
{
    Insumo insumo = db.Insumos.Find(id);
    if (insumo == null) return HttpNotFound();
    ViewBag.UnddId = new SelectList(db.Unidades, "UnidadeId", "Apelido", insumo.UnidadeId);
    ViewBag.UndConsId = new SelectList(db.Unidades, "UnidadeId", "Apelido", insumo.UnidadeConsumoId);
    return View(insumo);
}

1 Ответ

0 голосов
/ 07 мая 2018

Тот факт, что первый <select>, который вы визуализируете с помощью @Html.DropDownList("UnidadeId", ... ), не имеет атрибутов data-val-*, означает, что у вас есть еще один вход для свойства UnidadeId, сгенерированного методом HtmlHelper (я предполагаю, что @Html.HiddenFor(m => m.UnidadeId)) до @Html.DropDownList() метода.

Внутренне, html-помощники, которые генерируют элементы управления формой, вызывают GetUnobtrusiveValidationAttributes() метод HtmlHelper. Из исходного кода

Отображать атрибуты, только если включена ненавязчивая проверка на стороне клиента, и только в том случае, если мы никогда не отображали проверку для поля с этим именем в этой форме. Кроме того, если нет контекста формы, то мы не можем отобразить атрибуты (нам не нужно их прикреплять).

Когда вы POST формы, DefaultModelBinder устанавливает значение вашего UnidadeId на основе первой соответствующей пары имя / значение из запроса (ваш скрытый ввод) и игнорирует последующие соответствующие пары имя / значение, что объясняет, почему вы получаете исходное значение UnidadeId, а не значение, выбранное в раскрывающемся списке.

В качестве примечания, установка 4-го параметра в конструкторе new SelectList() не имеет смысла, поскольку он игнорируется вашим методом DropDownList() (значение свойства, с которым вы связываетесь, определяет то, что выбрано).

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