【问题标题】:Model binding form to a List using dropdown. binding failing 1 way for dropdown使用下拉列表将表单模型绑定到列表。绑定失败 1 种下拉方式
【发布时间】:2010-03-16 12:39:10
【问题描述】:

我有一个名为 Sessies 的动作。在此操作中,我正在从表单创建“Sessies”对象。如果它们不存在,我将它们添加到数据库中,如果已经有 Sessies 对象连接到“Reeksen”对象,我将“Sessies”加载到表单中以便可以编辑它们。所以我有一个创建和编辑 1 和相同的形式。

此外,“Reeksen”具有预定义数量的“Sessies”,无法更改。所以我让用户一次性制作所有“Sessies”(因为 sessies 的数量将从 1 到 10)

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<List<MVC2_NASTEST.Models.FlatSessie>>" %>
...
<h2>
    Sessies</h2>
<% using (Html.BeginForm()) {%>
<%= Html.ValidationSummary(true) %>
<fieldset>
    <legend>Fields</legend>
    <% for (int i = 0; i < Model.Count; i++) { %>

    <%= Html.HiddenFor(model => model[i].Ses_ID)%>
    <%= Html.HiddenFor(model => model[i].Ses_Rks_ID)%>

    <div class="editor-label">
        <%= Html.LabelFor(model => model[i].Ses_Nummer)%>
    </div>
    <div class="editor-field">
        <%= Html.HiddenFor(model => model[i].Ses_Nummer)%>
        <%= Html.Label(Model[i].Ses_Nummer.ToString())%>
    </div>

    ....

    <div class="editor-label">
        <%= Html.LabelFor(model => model[i].Ses_LG_ID)%>
    </div>
    <div class="editor-field">
        <%= Html.DropDownListFor(model => model[i].Ses_LG_ID, MVC2_NASTEST.MvcApplication.lesgeverList(), "Selecteer een lesgever...")%>
        <%= Html.ValidationMessageFor(model => model[i].Ses_LG_ID)%>
    </div>
    <div class="editor-label">
        <%= Html.LabelFor(model => model[i].Ses_Lpl_ID)%>
    </div>
    <div class="editor-field">
        <%= Html.DropDownListFor(model => model[i].Ses_Lpl_ID, (ViewData["lesplist"] as List<List<SelectListItem>>)[i], "Selecteer een lesplaats...")%>
        <%= Html.ValidationMessageFor(model => model[i].Ses_Lpl_ID)%>
    </div>
    <% } %>
    <p>
        <input type="submit" value="Create" />
    </p>

在我的 aspx 中,我使用了一个遍历列表的 for 循环(FlatSessie 是一个 Sessie 扁平字符串。)

  namespace MVC2_NASTEST.Models {

    public partial class FlatSessie {
        public int Ses_ID { get; set; }
        public int Ses_Nummer { get; set; }
        public string Ses_Datum { get; set; }
        public string Ses_Beginuur { get; set; }
        public string Ses_Einduur { get; set; }
        public int Ses_Lpl_ID { get; set; }
        public int Ses_Rks_ID { get; set; }
        public int Ses_LG_ID { get; set; }
    }
  }

所以,在我的代码中是这样的:

                    int antses = m.Mod_AantalSessies.Value;

                    List<List<SelectListItem>> lpllst = new List<List<SelectListItem>>(antses);

                    List<FlatSessie> sl = new List<FlatSessie>(antses);

                    Reeksen rks = _db.Reeksens.First(r => r.Rks_ID == id)

...

List<Sessies> sesl = rks.Sessies.ToList();

                        for (int i = 0; i < antses; i++) {
                            sl.Add(Mapper.Map<Sessies, FlatSessie>(sesl[i]));
                            lpllst.Add(MvcApplication.lesplaatsList(schooljaarparam, sesl[i].Ses_Lpl_ID));
                        }

...

    ViewData["lesplist"] = lpllst;
    ViewData["lglist"] = MvcApplication.lesgeverList();
    return View(sl);

和 lesgeverlist() 方法

public static List<SelectListItem> lesgeverList() {
            NASDataContext _db = new NASDataContext();
            var lesg = (from l in _db.Lesgevers
                        where l.LG_Naam != "leeg"
                        orderby l.LG_Naam
                        select l).ToSelectList(m => m.LG_Naam + " " + m.LG_Vnaam, m => m.LG_ID.ToString(), m => m.LG_ID < -1);
            return lesg.ToList();
        }

现在的问题:

这一切都非常出色。列表进入 ASPX,我得到表单的次数与列表中的项目一样多,并且回发也有效,解析完成和一切。所以一切都很好,除了 1 点:下拉菜单。

通常在 MVC 中,我不会为 SelectList 或 List 设置任何选定值,因为它们不需要它,在编辑页面中,MVC 在绑定时自行设置这些选定项。

然而,现在,使用 Foreach 循环中的表单,除了下拉框之外的所有字段都被填充,这些字段不会收到它们的“初始值”。

但是,当我将列表中的项目设置为选中时,它确实在表单中被选中。 (从 ViewData["lesplist"] 中可以看出)但是当我发送一个没有选定值的普通列表时,模型绑定器不会将该字段的给定值传播到下拉列表的选定值。

但是,当我提交表单并返回视图(因为验证失败)时,下拉菜单会保留其值。

这是可修复的,还是只是 MVC2 中的一个缺陷?

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-2 drop-down-menu selectlist


【解决方案1】:
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2013-03-27
  • 2012-04-01
相关资源
最近更新 更多