2011-05-03 13 views
2

我在查找表中列出了博客帖子類別(〜20)。 我想在多個頁面上將它們顯示爲用戶可以單擊的超鏈接列表。 我也想在兩個或更多的地方(不同的查看頁面)的下拉列表中顯示它們在ASP.NET MVC 3應用程序中處理類別部分視圖的最佳方法

以下作品&我看到類別作爲菜單/超鏈接列表。 但是這會導致我修改多個控制器,我需要顯示類別。 處理這個問題的最佳做法是什麼,以便我的代碼更改最少?

//#1 I added new class in one of my model: 
namespace MyApp.Models 
{ 
    ... 
    public class ShowPostModel 
    { 
     public Post Post { get; set; } 
     public IEnumerable<Category> Categories { get; set; } 
    } 
    public class Category 
    { 
     public string _id { get; set; } 
     public string Name { get; set; }  
    } 
} 

//#2 Populating the controller 
namespace MyApp.Controllers 
{ 
    public class BlogController : Controller 
    { 
    public ActionResult ShowPost() 
    { 
     ShowPostModel viewModel = new ShowPostModel(); 
     viewModel.Post = ReadBlogPostFromDB(); 
     viewModel.Categories = ReadCategoriesFromDB(); 
     return View(viewModel); 
    } 
    } 
} 

//#3 This is from my main view for showing the Post: 
@Html.Partial("_Categories", Model.Categories) 

//#4 This is my _Categories partial view: 
@model IEnumerable<MyApp.Models.Category> 
<section> 
    <header><b>Categories</b></header> 
    <ul style="padding:0;margin:0;"> 
     @foreach (var cat in Model) 
     { 
     <li> 
      <a href="/post/browse/[email protected]_id">@cat.Name</a> 
     </li> 
     } 
    </ul> 
</section> 

感謝您閱讀

編輯: 我做了這些改變,似乎工作爲好。 我可以在這裏做任何評論或改進?

//#1中刪除這條線從公共類ShowPostModel(模型現在DRY)

public IEnumerable<Category> Categories { get; set; } //刪除

//#2創建的基本控制器,並從它

public abstract class BlogBaseController : Controller 
    { 
     public BlogBaseController() 
     { 
     ViewBag.Categories = ReadCategoriesFromDB();     
     } 
    } 
繼承

//#3強制所有控制器,我需要從基本控制器繼承的類別

public class BlogController : BlogBaseController 

//#4改變我自己的看法

@Html.Partial("_Categories", (IEnumerable<MyApp.Models.Category>)@ViewBag.Categories) 

回答

0

如何閱讀你可能想嘗試創建2顯示了模板,一個在鏈接以顯示和一個在下拉列表中顯示。根據您告訴視圖使用特定模板的頁面,

+0

這很好。但我主要關心的是將類別代碼放在哪裏?修改每個控制器看起來很糟糕,而不是DRY – kheya 2011-05-03 21:10:09

+0

通過修改每個控制器,你的意思是做這個viewModel.Post = ReadBlogPostFromDB(); viewModel.Categories = ReadCategoriesFromDB();在每一個控制器?如果是的話,爲什麼不從模型中調用該功能,所以您不必從控制器中執行該功能? – atbebtg 2011-05-03 21:28:28

+0

我在我的代碼中修改了控制器和模型。在我的模型中,我不得不在另一個模型類中添加Category類和IEnumerable 。然後在控制器中,我必須填充列表(),以便視圖可以讀取它。 – kheya 2011-05-03 21:34:53

1

如果您在足夠的地方使用類別,可以將其封裝到基本控制器類中,並覆蓋OnActionExecuted。

然後,我會將類別放入ViewBag中的一個屬性,並將其傳遞到您的部分視圖中,並保留您的視圖模型。

+0

另外,在您的控制器中,您可以使用ViewData對象來存儲其他相關數據,例如類別列表,並且您可以在視圖/部分中引用 - 但@Michael已經很好地覆蓋了它。 – leon 2011-05-03 21:08:31

+0

@leonxki:這仍然需要我改變每個控制器,我需要可用的類別。 – kheya 2011-05-03 21:12:46

+0

查看我的編輯頂部 – kheya 2011-05-03 22:06:21

0

您可以創建一個過濾器來填充您的類別並將其添加到ViewData/ViewBag。然後,您可以將此過濾器應用於需要類別的控制器/操作。

爲了顯示,可以使用EditorTemplates或局部模板,讓您的UI代碼DRY ...

HTH。

+0

任何示例代碼,我可以看看? – kheya 2011-05-03 21:46:40

+0

查看我的編輯頂部 – kheya 2011-05-03 22:06:00

1

我想知道爲什麼沒有人建議使用RenderAction。你可以在你的基礎控制器中寫這個Action方法。這將使其在所有衍生控制器中都可用。通過這種方式,您可以使您的類別視圖具有強類型。此外,你應該把你的Categeories視圖放在Views/Shared目錄下,這樣每個控制器都可以訪問這個視圖。這樣做會使你保持乾爽,而且你仍然可以享受到強有力的視角。 編輯順便說一句,你不必讓基礎控制器使用renderaction。雖然上述方法是有效的,我更喜歡做這樣的,但你也可以有一個nvaigation控制器像

Public NavigationController:Controller() 
{ 
    public ActionResult Categories() 
    { 
     var Categories = FetchFromDB(); 
     return View(Categoires); 
    } 
} 

現在,可以調用使用上的任何地方本的RenderAction操作方法在應用程序中

+0

我已經在views/Shared文件夾下有_Category視圖。 – kheya 2011-05-04 07:58:26

+0

不知道我是否按照你的方法。謝謝 – kheya 2011-05-04 07:58:54

+0

@zahid他可能會希望它作爲部分視圖返回,因此它可以在Post視圖中呈現。 – frennky 2011-05-04 08:00:58

相關問題