2009-06-10 77 views
9

我想建立一個非常類似於StackOverflow配置文件管理的選項卡式菜單。如何在ASP.NET MVC中構建選項卡式菜單?

tabbed menu StackOverflow http://img410.imageshack.us/img410/3037/image1nwr.jpg

當你看看在URL,它說:/用戶/ flesym標籤=統計或標籤=首選項? 我能夠創建標籤式菜單,但我想知道如何調用操作方法並根據所選標籤顯示結果。

我試過使用局部視圖。但是當我的頁面/ users/flesym繼承自Mvc.ViewPage(myApplication.Models.User)時,我不能在我的分部視圖中使用另一個繼承(例如,我想使用Mvc.ViewUserControl(myApplication.Models)。格式))。

有關如何做到這一點的任何想法?

回答

9

創建視圖模型:

public class UserViewModel { 
    public myApplication.Models.User User; 

    public string PartialViewName; 

    public PartialViewModelBase Tab; 
} 

每個選項卡,從PartialViewModelBase衍生創建視圖模型:

public abstract class PartialViewModelBase { 
} 

public class Tab1PartialViewModel : PartialViewModelBase { 
    ... 
} 

public class TabNPartialViewModel : PartialViewModelBase { 
    ... 
} 

然後進行查看和PartialViews強類型:

查看:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<UserViewModel>" %> 

PartialViews:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Tab1PartialViewModel>" %> 

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<TabNPartialViewModel>" %> 

然後在您的視圖,你可以用你的部分看法吧:

<% Html.RenderPartial(Model.PartialViewName, Model.Tab); %> 

在你的控制器動作:

public ActionResult YourAction(string tab) 
{ 
    // check if tab is valid !!! 

    var model = new UserViewModel { 
     User = new myApplication.Models.User(); 
     PartialViewName = tab; 
     Tab = TabRepository.GetTabByName(tab); 
     /* 
     * or 
     * Tabs = (new Dictionary<string, type> { 
     *  {"Tab1", typeof(Tab1PartialViewName)}, 
     *  {"TabN", typeof(TabNPartialViewName)} 
     *  })[tab]; 
     */ 
    }; 

    Return View(model); 
} 

希望這有助於。

2

他們可能使用jQuery UI選項卡:http://docs.jquery.com/UI/Tabs

+0

我很驚訝,JQuery UI選項卡是全客戶端。 – erikkallen 2009-06-11 22:14:39

+0

不,他們不是,有一個選項可以通過ajax加載它們:http://docs.jquery.com/UI/Tabs#option-ajaxOptions – 2009-06-12 01:32:56

0

從外觀上來看,沒有一個標籤似乎沒有發射過的鏈接並查看HTML它透露任何東西,它只是似乎他們是風格看起來像他們的樣子,只是通過特定的查詢字符串值。

爲了在你需要抓取指定的查詢字符串值(如果存在)之後達到你想要的效果,然後相應地對結果數據進行排序。

0

另一種解決方案是創建一個使用querystring選擇不同動作的自定義路由(從RouteBase派生)。每個操作都會有一個單獨的視圖,該視圖使用包含頁面公共內容的母版頁。

基本上你會有「UsersController」動作「stats」,「prefs」等等。所有這些都是由你實現的自定義路由類選擇的。

相關問題