我有一个名为Sessies的动作。在这个动作中,我正在从一个表单创建“Sessies”对象。如果它们不存在我将它们添加到DB中,如果已经将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循环遍历List(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”]看到)但是当我发送没有选定值的普通List时,模型绑定器不会将该字段的给定值传播到下拉列表的选定值。
但是,当我进行表单提交时,我返回视图(因为验证失败),下拉列表会保留其值。
这是可修复的,还是MVC2中的一个缺陷?