ASP.NET MVC POST не отправит обратно второе вхождение переменной - PullRequest
0 голосов
/ 04 мая 2018

Класс Unidade:

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

Используется дважды в классе Insumo, как Unidade и UnidadeConsumo

public class Insumo
{
    public int InsumoId { get; set; }
    public string Apelido { get; set; }
    public string Descricao { get; set; }
    public int UnidadeId { get; set; }
    public Unidade Unidade { get; set; }
    public int UnidadeConsumoId { get; set; }
    public Unidade UnidadeConsumo { get; set; }
}

Для редактирования Insumo в контроллере есть два действия РЕДАКТИРОВАТЬ:

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);
}

И ПОЧТА РЕДАКТИРОВАТЬ:

[HttpPost]
public ActionResult Edit([Bind(Include = "InsumoId,Apelido,Descricao,UnidadeId,UnidadeConsumoId")] Insumo insumo)
{
if (ModelState.IsValid)
        {
            db.Entry(insumo).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }

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

Вид для отображения полей для редактирования, состоящий из двух раскрывающихся списков для выбора обоих единиц:

@model Gestor.Models.Insumo

@{
    ViewBag.Title = "Alterar";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Alterar</h2>

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Insumo</h4>
    <hr />

    @Html.Partial("CopyEdit")

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Gravar" class="btn btn-default" />
        </div>
    </div>
</div>
}

<div>
    @Html.ActionLink("Retornar a lista", "Index")
</div>

И частичное представление CopyEdit в центре:

@model Gestor.Models.Insumo
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.InsumoId)

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

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

<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("UnddId", null, 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("UndConsId", null, htmlAttributes: new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.UnidadeConsumoId, "", new { @class = "text-danger" })
    </div>
</div>

Проблема в том, что при возврате к действию POST Edit все поля в порядке, но UnidadeConsumoId всегда равен 0, чего даже нет в базе данных?

Может кто-нибудь сказать мне, почему он не возвращает ожидаемое значение, т.е. выбранное значение в раскрывающемся списке, отражающее идентификатор if?

1 Ответ

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

Поскольку ваш текущий код отображает элемент SELECT с name значением атрибута UndConsId.

<select class="form-control" name="UndConsId">
   <!-- options -->
</select>

Для работы привязки модели значение атрибута элемента ввода name должно совпадать с именем параметра / свойства, используемым в методе http post action. Ваше имя параметра UnidadeConsumoId, а не UndConsId

Чтобы устранить эту проблему, передайте UnidadeConsumoId в качестве первого параметра вызова метода DropDownList, чтобы он отображал элемент SELECT с name UnidadeConsumoId. Вы можете передать ViewBag.UndConsId в качестве второго параметра, чтобы явно указать коллекцию, которая будет использоваться для построения элемента SELECT.

Это должно работать

@Html.DropDownList("UnidadeConsumoId", ViewBag.UndConsId as SelectList, 
                                      new { @class = "form-control" })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...