У меня есть 3 таблицы:DROPDOWNLIST запись в ASP.NET MVC3 и Entity Framework модели
RateProfile
- RateProfileID
- ProfileName
Оценить
- RateID
- RateProfileID
- PanelID
- Другие вещи, чтобы обновить
Panel
- PanelID
- PanelName
У меня есть модели для каждого из них. У меня есть страница редактирования, использующая модель RateProfile. Я показываю информацию для RateProfile, а также все связанные с ней тарифы. Это прекрасно работает, и я могу его обновить. Однако я также добавил раскрывающееся меню, чтобы я мог фильтровать тарифы по идентификатору PanelID. Мне нужно, чтобы он возвращал изменения, чтобы отображать отфильтрованные ставки.
Я использую
@Html.DropDownList("PanelID", (SelectList)ViewData["PanelDropDown"], new { onchange = "$('#RateForm').submit()" })
для моего DropDownList. Всякий раз, когда он возвращается к моему методу редактирования HttpPost, однако, кажется, отсутствует вся информация о свойствах навигации по тарифам. Это странно, потому что я думал, что это будет делать именно то, что делает кнопка ввода/отправки, которая у меня есть в форме (которая фактически передает всю модель обратно в мое действие HttpPost Edit и делает то, что я хочу, чтобы она делала). PanelID правильно передается на мой метод HttpPost Edit и на следующее представление, но когда я пытаюсь запросить свойство навигации Model.Rates, оно равно null (только когда сообщение появляется из раскрывающегося списка. Все работает отлично, когда сообщение приходит из мой вводный ввод).
Get Edit:
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 Edit:
[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();}
Может быть, когда вы делаете свое сообщение из выпадающего списка, какое-то поле делает страницу недействительной, что в вашем коде означает, что вы не добавляете ставки, следовательно, когда вы пытаетесь запросить ставки на ваше другое мнение, что они просто null? –
@ TheJonasPersson Я бы так не подумал. Если я перейду на страницу и просто нажмите кнопку «Отправить», ничего не изменив, она представит штраф и вернет тот же вид, но если я отправлю его с помощью изменения выпадающего списка, модель не будет передана моему действию редактирования с сохраненными свойствами навигации и новое представление, которое появляется, не может запрашивать свойство навигации по ценам и, следовательно, все поля редактора отсутствуют. В любом случае это должно просто ничего не делать и возвращать текущее представление. –