2009-06-10 75 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”等等。所有这些都是由你实现的自定义路由类选择的。

相关问题