Sessiesというアクションがあります。このアクションでは、フォームから「Sessies」オブジェクトを作成しています。それらが存在しない場合はDBに追加し、「Reeksen」オブジェクトに接続されているSessiesオブジェクトがすでに存在する場合は、「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の単なる欠陥ですか?