私は3つのテーブルを持っています:
RateProfile
- RateProfileID
- プロファイル名
レート
- RateID
- RateProfileID
- PanelID
- 更新する他のもの
パネル
- PanelID
- PanelName
これらのそれぞれのモデルがあります。RateProfileモデルを使用した編集ページがあります。RateProfileの情報と、それに関連付けられているすべてのレートを表示します。これは正常に機能し、正常に更新できます。ただし、PanelIDでレートをフィルタリングできるように、ドロップダウンも追加しました。フィルタリングされたレートを表示できるように、変更をポストバックする必要があります。
使っています
@Html.DropDownList("PanelID", (SelectList)ViewData["PanelDropDown"], new { onchange = "$('#RateForm').submit()" })
私のドロップダウンリストのために。ただし、HttpPost Editメソッドにポストバックするときはいつでも、Ratesナビゲーションプロパティに関するすべての情報が欠落しているようです。フォームにある入力/送信ボタンとまったく同じように機能すると思ったので、奇妙です(実際には、モデル全体がHttpPost Editアクションに戻され、必要な処理が実行されます)。panelIDはHttpPostEditメソッドに適切に渡され、次のビューに渡されますが、Model.Ratesナビゲーションプロパティをクエリしようとするとnullになります(投稿がドロップダウンからのものである場合のみ。投稿がからのものである場合はすべて正常に機能します私の送信入力)。
編集する:
public ActionResult Edit(int id, int panelID = 1)
{
RateProfile rateprofile = db.RateProfiles.Single(r => r.RateProfileID == id);
var panels = db.Panels;
ViewData["PanelDropDown"] = new SelectList(panels, "PanelID", "PanelName", panelID);
ViewBag.PanelID = panelID;
return View(rateprofile);
}
HttpPost編集:
[HttpPost]
public ActionResult Edit(RateProfile rateprofile, int panelID)
{
var panels = db.Panels;
ViewData["PanelDropDown"] = new SelectList(panels, "PanelID", "PanelName", panelID);
ViewBag.PanelID = panelID;
if (ModelState.IsValid)
{
db.Entry(rateprofile).State = EntityState.Modified;
foreach (Rate dimerate in rateprofile.Rates)
{
db.Entry(dimerate).State = EntityState.Modified;
}
db.SaveChanges();
return View(rateprofile);
}
return View(rateprofile);
}
意見:
@model PDR.Models.RateProfile
@using (Html.BeginForm(null,null,FormMethod.Post, new {id="RateForm"}))
{
<div>
@Html.Label("Panel")
@Html.DropDownList("PanelID", (SelectList)ViewData["PanelDropDown"], new { onchange = "$('#RateForm').submit()" })
</div>
@{var rates= Model.Rates.Where(a => a.PanelID == ViewBag.PanelID).OrderBy(a => a.minCount).ToList();}
@for (int i = 0; i < rates.Count; i++)
{
<tr>
<td>
@Html.HiddenFor(modelItem => rates[i].RateProfileID)
@Html.HiddenFor(modelItem => rates[i].RateID)
@Html.HiddenFor(modelItem => rates[i].PanelID)
@Html.EditorFor(modelItem => rates[i].minCount)
@Html.ValidationMessageFor(model => rates[i].minCount)
</td>
<td>
@Html.EditorFor(modelItem => rates[i].maxCount)
@Html.ValidationMessageFor(model => rates[i].maxCount)
</td>
<td>
@Html.EditorFor(modelItem => rates[i].Amount)
@Html.ValidationMessageFor(model => rates[i].Amount)
</td>
</tr>
}
<input type="submit" value="Save" />
}
私の問題を要約すると、私のビューでの以下のクエリは、投稿が送信ボタンからのものであり、ドロップダウンリストからのものではない場合にのみ機能します。
@{var rates= Model.Rates.Where(a => a.PanelID == ViewBag.PanelID).OrderBy(a => a.minCount).ToList();}