Как вызвать контроллер из Layout Html.Partial

#asp.net #asp.net-mvc #asp.net-mvc-3 #razor

#asp.net #asp.net-mvc #asp.net-mvc-3 #бритва

Вопрос:

Я работаю с Asp.net MVC 4, двигатель razor. Я разрабатываю приложение, и меню динамически создается ролью пользователя

ОБНОВЛЕНИЕ В моем приложении мне нужно, чтобы пользователь вводил свои учетные данные с этими восстановленными данными о роли пользователя и создавал динамическое меню для роли. Мой главный экран: введите описание изображения здесь

в моем _Layout.cshtml у меня есть этот код:

 @if (Request.IsAuthenticated){
        Html.Partial("Menu");
    } else { 
        <div class="sectiontitle">amp;nbsp;</div>
    }
  

Я создаю базовый контроллер:

 public class BaseController : Controller
{
    public BaseController(){
        ViewBag.Menu = BuildMenu();
    }

    private IList<Models.AdmMenu> BuildMenu()
    {      
            IList<Models.AdmMenu> mmList = new List<Models.AdmMenu>(){
            new Models.AdmMenu(){ Id = 1, Name = "Home", ParentId = 0, SortOrder = 1} ,
            new Models.AdmMenu(){ Id = 2, Name = "Admin", ParentId = 0, SortOrder = 1},
            new Models.AdmMenu(){ Id = 3, Name = "Account", ParentId = 0, SortOrder = 1},
            .....
            .....
  

И в моем контроллере raLoginController.cs у меня есть это:

 public class raLoginController : BaseController{                
    [HttpPost]
    public ActionResult Login(Models.AdmLogin login){
        if (ModelState.IsValid){
            Servicio.cSeReclamo Servicio = new Servicio.cSeReclamo(login.UserName, login.Password);
            if (Servicio.ValidarUsuario()){
                string Mensaje = "";
                Models.AdmUsuario oAdmUsuario = new Models.AdmUsuario();
                oAdmUsuario.Au_codusuario = login.UserName;
                Servicio.RetornaEntidad<Models.AdmUsuario>(ref Mensaje, "admsis.adm_usuario", oAdmUsuario.getPk(), oAdmUsuario);                                      
                FormsAuthentication.SetAuthCookie(login.UserName, false);  

                var ticket = new FormsAuthenticationTicket(1,
                    login.UserName,
                    DateTime.Now,
                    DateTime.Now.AddMinutes(30),
                    false,
                    LoadData(oAdmUsuario,Servicio.Pais(ref Mensaje))
                );

                string encTicket = FormsAuthentication.Encrypt(ticket);
                HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);

                if (ticket.IsPersistent) {
                    faCookie.Expires = ticket.Expiration;
                }
                Response.Cookies.Add(faCookie);
                return RedirectToAction("index", "raMainReclamo", new { area = "Reclamos"});
            }
        }
        return View(login);
    }
  

В Menu.cshtml (частичный просмотр)

  @{
    List<Crd.Web.Models.AdmMenu> menuList = ViewBag.Menu;       
}
<div class="sectiontitle">     
<ul class="menu" id="header">  
    @foreach (var mp in menuList.Where(p => p.ParentId == 0))
    {    
        <li><a href="#">@mp.Name</a> 
        @if (menuList.Count(p => p.ParentId == mp.Id) > 0)
        {
            @:<ul>
        }          
        @RenderMenuItem(menuList, mp)       
        @if (menuList.Count(p => p.ParentId == mp.Id) > 0)
        {
            @:</ul>
        }       
        </li>
    }
</ul>   
</div> 
  

Но когда я ввожу учетные данные, появляется следующая ошибка:
введите описание изображения здесь

список меню равен нулю, почему? Я шаг за шагом следую коду, вводит BaseController и выполняет метод BuildMenu… почему null? У меня есть это сообщение: введите описание изображения здесь

Как решить эту проблему?

Ответ №1:

Вы можете вызвать действие контроллера с помощью

 @Html.Action("Action", "Controller")
  

Ваше действие контроллера может выполнять

 Session["Menu"] == null
  

проверьте и загрузите его, если необходимо. Затем верните частичный с

 return PartialView("_Partial");
  

Самое приятное в использовании этого подхода заключается в том, что он позволит вам получить код проверки сеанса [«Menu»] из вашей страницы макета.

Я не совсем уверен, поможет ли это; пожалуйста, при необходимости уточните свой вопрос.

Комментарии:

1. Я добавил Html. Действие («Действие», «Контроллер») в _Layout.cshtml заменено, если (сессия [«Меню»] == null){ Session[«Menu»] = Html.Partial(«_Menu»); } для этого if (Session[«Menu»] == null){ HTML. Действие («Menu», «raLogin»); } но у меня ошибка HttpException

2. Измените Html.Action("Menu","raLogin") на Html.RenderAction("Menu","raLogin") , поскольку вы находитесь внутри блока кода. Какую ошибку вы получаете?

Ответ №2:

Нет смысла сохранять результат Html.Partial действия (который является MvcHtmlString) Session . Просто создайте MenuController с помощью метода, например CreateForRole , и вызовите:

 @{Html.RenderAction("CreateForRole","Menu")}
  

Этот метод должен возвращать представление, действительное для зарегистрированной роли. Если вы теперь хотите заново создавать меню при каждом вызове (что вам и следует — представьте, что вашему пользователю предоставляются дополнительные роли без выхода из системы), и вам действительно нужно сохранить этот вызов, вместо этого используйте кэширование с ролью в качестве параметра.

Комментарии:

1. Я добавил {Html.RenderAction(«CreateForRole»,»Menu»)}, замененный в моем сеансе _Layout.cshtml[«Menu»] = Html.Partial(«_Menu»); и у меня такая ошибка: пользователь кода не управляет HttpException

2. Я хотел бы помочь, но, пожалуйста, предоставьте более подробную информацию об этой ошибке.