代码之家  ›  专栏  ›  技术社区  ›  Stefanvds

使用下拉列表将窗体绑定到列表。绑定失败1路下拉

  •  1
  • Stefanvds  · 技术社区  · 14 年前

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

    此外,“reeksen”具有预定义数量的“sessions”,无法更改。所以我让用户一次完成所有的会话(因为会话的数量是从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是一个session扁平字符串)。

      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,我得到表单的次数和列表中的项目一样多,回发也可以,解析也可以。所以一切都很好,除了一点:下拉列表。

    通常在mvc中,我不会为selectList或列表设置任何选定值,因为它们不需要它,在编辑页面中,mvc会在绑定时设置这些选定项本身。

    但是,当表单在foreach循环中时,所有字段都将被填充 此外 下拉框中,它们不接收“初始值”。

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

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

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

    1 回复  |  直到 14 年前