2012-06-24 114 views
0

我有3個表:DROPDOWNLIST後在ASP.NET MVC3和Entity Framework模型

RateProfile

  • RateProfileID
  • 摘要名稱

  • RateID
  • RateProfileID
  • PanelID
  • 其他的東西,更新

面板

  • PanelID
  • PanelName

我有型號爲每個這些。我有一個使用RateProfile模型的編輯頁面。我顯示RateProfile的信息以及與之相關的所有匯率信息。這工作正常,我可以更新它。不過,我還添加了一個下拉菜單,以便我可以按PanelID過濾費率。我需要它回覆更改,以便它可以顯示過濾的費率。

我使用

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

我的下拉列表。每當它回發到我的HttpPost編輯方法,但它似乎缺少有關率導航屬性的所有信息。這很奇怪,因爲我認爲它會完全符合我在表單中輸入/提交按鈕的內容(它實際上將整個模型傳遞迴到我的HttpPost Edit操作並執行我想要的操作)。 panelID被正確地傳遞給我的HttpPost編輯方法,並轉到下一個視圖,但是當我嘗試查詢Model.Rates導航屬性爲空(僅當郵件來自下拉菜單時。我的提交輸入)。

獲取編輯:

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();} 
+0

難道這是因爲,當你從下拉菜單中選擇你的帖子時,有些字段會使頁面無效,在你的代碼中這意味着你不添加費率,因此,當你嘗試查詢費率時你的其他看法,他們根本無效? –

+0

@TheJonasPersson我不這麼認爲。如果我轉到頁面,只需單擊提交而不更改任何內容,它會提交罰款並返回相同的視圖,但如果通過更改下拉列表提交,模型不會傳遞到我的編輯操作,導航屬性保持不變,並且出現的新視圖無法查詢費率導航屬性,因此缺少所有編輯器字段。無論哪種方式,它應該什麼都不做,並返回當前視圖。 –

回答

0

它在呈現的頁面中的外觀如何?您可能有兩個因素正在呈現具有相同名稱/ ID:

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

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

他們的名稱是不同的:編輯器字段 –

0

我建議你使用Firefox/Firebug的檢查,它正在取得實際的請求。我無法想象,如果通過提交與按鈕觸發,表單的發佈方式會有所不同,但我認爲這是可能的。

在一個更大的筆記,我會對你的設計作出一些評論。

  1. 我會使用ViewBag屬性來進行選擇,而不是對ViewData進行基於密鑰的訪問。在控制器和視圖中,這將更加可讀。

  2. 考慮讓單獨的操作填充由下拉列表過濾的信息。根據PanelID在視圖中呈現該動作,並通過AJAX調用該動作來獲取新的HTML,而不是完成一個完整的表單發佈。

  3. 避免在您的標記中應用您的處理程序。相反,在您的母版頁上添加一個可選的「腳本」部分,並在需要時將腳本添加到您的頁面,以便通過該部分應用您的行爲。這允許您通過主控制器來控制視圖特定的腳本放置在文檔中,並將您的行爲與文檔結構分開,這是可讀性的最佳實踐。

+0

我對你的建議1和2感謝下拉對比id =「rates_1__PanelID」name =「rates [1] .PanelID」id =「PanelID」name =「PanelID」 。 –

0

我發現了這個問題。它看起來像是因爲我只是循環瀏覽屬性的一個子集(利用panelID過濾),從視圖返回的模型只有該子集的導航屬性可用。保存更改後,我只是重新定義了我的模型(再次從數據庫中稱爲記錄),現在看起來很好。

即,我的導航屬性中應該有140條記錄,通過panelID == 1進行篩選將其縮小爲28條記錄。由於某種原因,實體框架決定它不想維護與其他112條記錄的關係,所以當我將下拉列表更改爲panelID == 2進行過濾時,唯一可用的記錄全部具有panelID == 1並且返回null 。

相關問題