2012-06-24 2 views
0

У меня есть 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();} 
+0

Может быть, когда вы делаете свое сообщение из выпадающего списка, какое-то поле делает страницу недействительной, что в вашем коде означает, что вы не добавляете ставки, следовательно, когда вы пытаетесь запросить ставки на ваше другое мнение, что они просто null? –

+0

@ TheJonasPersson Я бы так не подумал. Если я перейду на страницу и просто нажмите кнопку «Отправить», ничего не изменив, она представит штраф и вернет тот же вид, но если я отправлю его с помощью изменения выпадающего списка, модель не будет передана моему действию редактирования с сохраненными свойствами навигации и новое представление, которое появляется, не может запрашивать свойство навигации по ценам и, следовательно, все поля редактора отсутствуют. В любом случае это должно просто ничего не делать и возвращать текущее представление. –

ответ

0

Как выглядит на рендеринг?Вы можете иметь два элемента, оказываемые с тем же именем/ID:

@Html.DropDownList("PanelID", (SelectList)ViewData["PanelDropDown"], new { onchange = "$('#RateForm').submit()" 

и

@Html.HiddenFor(modelItem => rates[i].PanelID) 
+0

Это имя по-разному: id = "PanelID" name = "PanelID" для раскрывающегося списка vs id = "rates_1__PanelID" name = "rates [1] .PanelID" для полей редактора –

0

Я предлагаю вам использовать Firefox/Firebug для изучения фактического запроса, что это делается. Я не могу себе представить, что форма будет публиковаться иначе, если она будет вызвана через кнопку submit против кнопки, но я полагаю, что это возможно.

На большой ноте я бы сделал пару комментариев о вашем дизайне.

  1. Я бы использовал свойства ViewBag для ваших выборов, а не доступ к ViewData на основе ключа. Это будет более читаемым как в вашем контроллере, так и в вашем представлении.

  2. Рассмотрите возможность отдельного действия, которое заполняет информацию, отфильтрованную выпадающим списком. Измените это действие в своем представлении на основе идентификатора PanelID и вызовите это действие через AJAX, чтобы получить новый HTML, а не делать сообщение в виде полной формы.

  3. Избегайте применения ваших обработчиков в разметке. Скорее добавьте необязательный раздел «Сценарии» на главную страницу и, при необходимости, добавьте скрипты на свою страницу, которые применяют ваше поведение в этом разделе. Это позволяет вам управлять с помощью мастера, в котором сценарии, специфичные для просмотра, размещаются в документе и сохраняют ваше поведение отдельно от вашей структуры документа, что является лучшей практикой для удобства чтения.

+0

Я рассмотрю ваши советы по 1 и 2. Спасибо , –

0

Я нашел проблему. Это похоже на то, что я только перебирал подмножество моего свойства навигации (тарифы, фильтруемые по идентификатору panelID), модель, которая была возвращена из представления, имела только тот набор доступных свойств навигации. После сохранения изменений я просто переопределил свою модель (так называемую запись из базы данных снова), и теперь она выглядит хорошо.

Т.е. В моем навигационном свойстве должно было быть 140 записей, фильтрация по панелиID == 1 сузила до 28 записей. По какой-то причине инфраструктура сущности решила, что ей не хотелось поддерживать связь с другими 112 записями, поэтому, когда я изменил раскрывающийся список для фильтрации по идентификатору panelID == 2, единственные доступные записи имели панельID == 1 и возвращали null ,

Смежные вопросы