在部分视图中访问数据库信息,.ascx包含在asp.net mvc中的Site.Master中

时间:2011-04-02 05:54:57

标签: asp.net asp.net-mvc-2 master-pages partial-views

嗨,我遇到了这个问题。我正在开发一个asp.net mvc 2应用程序。我有一个局部视图menu.ascx定义。这将包含在Site.Master主页中我网站的所有页面上。现在问题是我希望我的菜单根据用户类型进行更改。 这是我最初做的事情:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<li><%: Html.ActionLink("Home", "Index", "Home")%></li>
<% 
    ExtendedMemberShip.MemberShipUser user = ExtendedMemberShip.MemberShip.GetUser(HttpContext.Current.User.Identity.Name);
    string course = "Course/Index/";
    if(user != null) course += user.UserName;
%>
<% 
     if(user!=null && user.Type == "stud") { 
%>
         <li><%: Html.ActionLink("Courses", "Index", course)%></li>
<% 
      }
%>
<li><%: Html.ActionLink("Votes", "About", "Home")%></li>
<li><%: Html.ActionLink("Comments", "About", "Home")%></li>
<li><%: Html.ActionLink("Exam archives", "About", "Home")%></li>

这个问题是我不应该在视图中这样做!但由于这是MasterPage没有控制器实际调用它所以我不知道将信息放在ViewData字典或ViewModel中将其传递到此母版页... 任何想法?

1 个答案:

答案 0 :(得分:1)

您仍然可以在控制器中执行此操作。将相关数据填充到ViewData字典中:

public ActionResult Any()
{
    LoadUserType();
    return View();
}

private void LoadUserType()
{
    ExtendedMemberShip.MemberShipUser user = 
        ExtendedMemberShip.MemberShip.GetUser(HttpContext.Current.User.Identity.Name);
    ViewData["UserType"] = user.Type;
}

在您的母版页中使用:

<% Html.RenderPartial("Menu", ViewData["UserType"]) %>

您可以通过创建为您执行此操作的自定义属性或将其放在所有控制器扩展的基类中来避免调用LoadUserType()或其他任何内容。

或者,您可以将菜单项填充为模型的一部分,并将模型传递给PartialView。