доступ к информации базы данных в частичном представлении, .ascx, который включен в Site.Master в asp.net mvc - PullRequest
0 голосов
/ 02 апреля 2011

Привет, у меня проблемы с этим.Я занимаюсь разработкой приложения 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 Ответ

1 голос
/ 02 апреля 2011

Вы все еще можете сделать это в вашем контроллере.Заполните соответствующие данные в словаре 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.

...