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);
}
和POST编辑:
[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编辑操作,所有字段都没问题,但是UnidadeConsumoId总是0,数据库中甚至不存在什么?
有人可以告诉我为什么它没有返回预期的值,即下拉列表中反映if的id的选定值?
答案 0 :(得分:2)
因为您当前的代码正在呈现具有name
属性值UndConsId
的SELECT元素。
<select class="form-control" name="UndConsId">
<!-- options -->
</select>
要使模型绑定起作用,输入元素name
属性值应与http post action方法中使用的参数/属性名称匹配。您的参数名称为UnidadeConsumoId
,而不是UndConsId
要解决此问题,请将UnidadeConsumoId
作为DropDownList
方法调用的第一个参数传递,以便它使用name
UnidadeConsumoId
呈现SELECT元素。您可以传递ViewBag.UndConsId
作为第二个参数,以显式指定用于构建SELECT元素的集合。
这应该有效
@Html.DropDownList("UnidadeConsumoId", ViewBag.UndConsId as SelectList,
new { @class = "form-control" })