【问题标题】:@Html.DropDownList rendering different HTML and not returning but default@Html.DropDownList 呈现不同的 HTML 并且不返回但默认
【发布时间】:2018-05-07 06:34:15
【问题描述】:

两个相同的@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);
}

【问题讨论】:

  • 你能分享你的GET操作方法代码吗?
  • 另外,您共享的 HTML 标记与剃须刀代码不匹配!它不可能生成带有nameid UnId 的SELECT 元素。看起来你没有在问题中分享正确的代码!!!
  • 另外,您应该考虑使用视图模型并通过它传递集合,同时使用将正确绑定项目的Html.DropDownListFor 帮助方法
  • @Shyju 我在最后发布了 GET 代码...
  • 阅读我的第二条评论和第三条评论

标签: c# html asp.net-mvc razor


【解决方案1】:

事实上,您使用@Html.DropDownList("UnidadeId", ... ) 渲染的第一个&lt;select&gt; 没有任何data-val-* 属性意味着您有另一个使用HtmlHelper 方法生成的UnidadeId 属性输入(我假设@ 987654327@) 在@Html.DropDownList() 方法之前。

在内部,生成表单控件的 html 助手调用 HtmlHelperGetUnobtrusiveValidationAttributes() 方法。来自source code

仅当启用了不显眼的客户端验证时才呈现属性,并且仅当我们从未在此表单中为具有此名称的字段呈现验证时。另外,如果没有表单上下文,那么我们就无法渲染属性(我们没有附加它们的能力)。

当您发布表单时,DefaultModelBinder 会根据请求中第一个匹配的名称/值对(您的隐藏输入)设置您的 UnidadeId 的值,并忽略后续匹配的名称/值对,这解释了原因您将获得 UnidadeId 的原始值,而不是在下拉列表中选择的值。

附带说明,在 new SelectList() 构造函数中设置第 4 个参数是没有意义的,因为它被 DropDownList() 方法忽略(它是您绑定的属性的值,它决定了选择的内容)。

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 2016-08-03
    • 2012-02-08
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多