2012-10-10 20 views
2

我是一個很長時間的WebForms開發人員,但終於通過將需要更新的WebForms網站之一轉換爲MVC3來學習MVC。新手MVC常見的隱藏和顯示內容的做法

我從閱讀中瞭解MVC的基礎知識,但在第一天就在現實世界中苦苦掙扎,可能很簡單,我也想知道如何做到這一點,以及最佳做法。

對於這個問題,我不是在尋找代碼(儘管可能有點幫助),只是足夠的信息讓我走上正確的道路。我已經看過不少例子和教程,但似乎沒有顯示出與我的情況相關的東西,所以我在這裏問。

因此,我正在處理的第一頁是搜索結果頁面。這比簡單的搜索頁面更復雜一點。如果它發現拼寫錯誤的單詞,沒有找到結果的區域,以及搜索結果本身的區域(如果有),它都有一個建議區域。

因爲它搜索兩個數據庫表(實際上是視圖)我有一個模型,它包含表模型和一個優先級字段,我用它來排序最相關的結果。該模型是這樣的:

public class SearchResult 
{ 
    public Table1 { get; set; } 
    public Table2 { get; set; } 
    public int Priority { get; set; } 
} 

在我使用的面板包含每個區域的,所以我可以打開和關閉他們,像這樣的WebForms:背後

<asp:Panel ID=」panSuggest」 runast=」server」 Visible=」false」> 
    … 
</asp:Panel> 
<asp:Panel ID=」panNoResults」 runat=」server」 Visible=」false」> 
    … 
</asp:Panel> 
<asp:Panel ID=」panResults」 runat=」server」> 
    <asp:Repeater ID=」repResults」 runat=」server」> 
     … 
    </asp:Repeater> 
</asp:Panel> 

在我目前的WebForms代碼邏輯我看看是否有任何拼寫錯誤的作品,如果是這樣,顯示panSuggest和隱藏所有其他面板。如果沒有錯誤,則根據需要隱藏show panResults/panNoResults。

那麼這種事情通常是在MVC中完成的?我是否在我的控制器中設置了一個ViewBag項目,以確定是否應在我的視圖中顯示PanSuggest,然後選擇隱藏/顯示,並檢查我的模型是否有任何項目以確定是否應顯示panResults/panNoResults 。像我的代碼在下面,或者這不是正確的方法嗎?

@{ if (ViewBag.Suggest == true) { 
    <div> 
     Suggest 
    </div> 
} else { 
    @{ if (Model.Count == 0) { 
     <div> 
      No Results 
     </div> 
} else { 
     <div> 
      @foreach (var result in Model) { 
       @result.Table1.Whatever etc etc 
      } 
     </div> 
} 
} 

更新。

我一直在閱讀更多,並有很多建議,以避免ViewBag。

那麼相反,我應該改變我的模型,包括我需要的額外數據?這樣

Public class ViewModel 
{ 
    public string Suggest { get; set; } 
    public List<SearchResult> Result { get; set; } 
} 

public class SearchResult 
{ 
    public Table1 { get; set; } 
    public Table2 { get; set; } 
    public int Priority { get; set; } 
} 

東西然後在我看來,我可以檢查是否ViewModel.Suggest不爲空,檢查ViewModel.Result,看看是否有物品(搜索結果)的存在。

這是一個更好的解決方案嗎?

+0

用另一種可能的方法更新了問題。 – johna

+0

視圖模型方法是一個很好的方法。您的視圖模型可以提供所需的所有信息。它可能是可重用的,可能只是針對這一個觀點。這與Web Forms相比有很大的不同,它通常與域模型/數據緊密耦合。 –

回答

4

如果我有需要顯示2個不同的表,我會以同樣的,我會改變的唯一事情就是

@{ 
    if (ViewBag.Suggest == true) 
    { 
     <div> 
      Suggest 
     </div> 
    } else { 
     <table> 
      <thead> 
       <th>Header column</th> 
      </thead> 
      <tbody> 
      @{ if (Model != null && Model.Any()) { 
       <tr> 
       @foreach (var result in Model) 
       { 
        <td> 
         @result.Table1.Whatever etc etc 
        </td> 
       } 
       </tr> 
      } else { 
       <tr> 
        <td> 
         No Results 
        </td> 
       </tr> 
      } 
      </tbody> 
     </table> 
    } 
} 
0

我的做法是基本一樣的你。我的基本原理是將所有業務邏輯放入控制器中,並將簡單的指示器傳遞給ViewBag中的視圖,該視圖指示顯示數據的任何選項。通常,這將是一個簡單的布爾值,例如ViewBag.Suggest值。