2012-03-21 68 views
0

我是MVC的新手,並決定將其用於我的最新項目。我的任務是重新設計我公司的Intranet主頁,這實際上是一堆列中的鏈接和子鏈接。asp.net MVC的數據模型幫助

實施例:

    • 鏈接1
    • 鏈路2
  • 鏈路3
  • 鏈路4
    • 鏈路5

美中不足的是,他們希望這些鏈接來自哪個將從/管理頁面進行管理(添加,編輯,訂單,刪除)的數據庫。因爲它是首頁,所以我想盡可能少的db調用,但不一定要這樣。

我創建了一個數據庫表,並在MVC中找到它很困難(雖然我有點不懂)並在頁面上呈現它,並且在View頁面中沒有太多代碼,但我認爲這不是目的/ MVC的最佳實踐,我必須在我的模型中做錯事。

這裏是我的表結構,例如記錄:

ID| Text  | Href  | OrderId | NewWindow | ParentId 
1 | Head  | NULL  | 1 | 0  | NULL 
2 | Link 1 | link1.htm | 1 | 1  | 1 
3 | Link 2 | link2.htm | 2 | 1  | 1 
4 | Link 3 | link3.htm | 2 | 1  | NULL 
5 | Link 4 | link4.htm | 3 | 1  | NULL 
6 | Link 5 | link5.htm | 1 | 1  | 5 

差不多我在做這回全表這真的很亂foreach循環,而我確定「頭(父)鏈接」和處理HTML相應。它真的讓我想起了經典的asp日子。

我希望有一些做的模型,並用較小的數據集工作。

你對我應該如何處理這個任何提示/建議/評論?

回答

0

正如你所說,最好避免在你看來這樣複雜的邏輯。儘可能多的,你應該傳遞你的視圖簡單的數據來顯示。您總是可能會有一些ifforeach陳述,但比您想要避免的要複雜得多。

最好在控制器的操作方法中擁有數據訪問和對象組裝,從不在視圖中,通常這些操作甚至可能會被用於其他服務(例如調用一個存儲庫,一個對映射器的調用)。一般來說,最好將ViewModel對象傳遞給您的視圖,而不是直接從您的域中獲取對象。(儘管在這種情況下,無論如何,因爲這些對象總是用於顯示目的,所以您可能不會太擔心。)

如果這些鏈接是特定的,您可能會將所有這些東西放在HomeController的操作方法中到主頁,或者如果它是一個網站的菜單,你可以有一個單獨的NavController專門處理它。

例如

public class NavController : Controller 
{ 
    // ... 

    [ChildActionOnly] 
    public PartialViewResult SiteMenu(string currentPage) 
    { 
     // Get your flat list of menu items from the DB 
     var menuItems = _siteMapRepo.GetMenuItems(); 

     // Map them into something more tree-like... 
     var treeMenu = MapFlatItemsToTreeMenu(menuItems); 

     return View("_Menu", treeMenu); 
    } 

    // ... 
} 

然後,你可以有一個局部視圖呈現這些,例如, _Menu.cshtml。

然後在父視圖的地方,很可能是你的站點佈局,你可以有一個RenderAction呼叫拉菜單:

@{Html.RenderAction("SiteMap", "Nav");} 

在_Menu.cshtml的代碼可能會變得有趣,因爲你處理樹結構。你可能在你的局部視圖中有遞歸調用,在葉節點觸底,最好使用RenderPartial而不是RenderAction,因爲RenderAction會產生新的請求。喜歡的東西...

@model MenuItem 

@if (Model.HasChildren) 
{ 
    <ul> 
    @foreach (var child in Model.Children) 
    { 
     @{Html.RenderPartial("_Menu", child);} 
    } 
    </ul> 
} 
else 
{ 
    <li> 
     // do something with Model.Url etc. 
    </li> 
} 

免責聲明:我沒有實際試過,只是寫出來,但它應該給要點,我希望。

你也當然可以看看別人已經推出這樣的事情已經可以使用,例如MvcSiteMapProviderMvcTreeView

+0

有關將樹的鄰接表表示映射到對象層次結構的信息,請參閱此問題的一些信息:http://stackoverflow.com/questions/8361911/asp-net-databound-menu-multilevel/8364548#8364548 – ngm 2012-04-02 18:37:14

0

我在我的項目中做了同樣的事情。如果這些數據僅用於站點地圖,那麼數據庫行對此太過擔心。

我用了一個XML文件(也可以存儲在數據庫作爲一個字段)保存網站地圖,並能正常工作至今。

這樣做的好處是它可以很容易地綁定到層級小部件:樹或ul。並且容易緩存,因爲它很少被修改。 鏈接和文本信息可以存儲在xml屬性中。

+0

而你使用ASP.NET MVC的呢? – Antoni 2012-03-21 18:29:59