【问题标题】:How To Call Controller from Layout Html.Partial如何从布局 Html.Partial 调用控制器
【发布时间】:2014-08-14 01:50:34
【问题描述】:

我正在使用 Asp.net MVC 4,引擎剃须刀。 我正在开发一个应用程序,菜单是由用户的角色动态创建的

更新 在我的应用程序中,我需要用户使用这些恢复的用户角色数据输入他们的凭据,并为角色构建动态菜单。 我的主屏幕是:

在我的 _Layout.cshtml 我有这个代码:

@if (Request.IsAuthenticated){
        Html.Partial("Menu");
    } else { 
        <div class="sectiontitle">&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> 

但是当我输入凭据时出现以下错误:

menulist 等于 null,为什么?我是按照代码一步一步来的,进入BaseController,执行BuildMenu方法……为什么是null? 我有这个消息:

如何解决这个问题?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 razor


    【解决方案1】:

    您可以通过使用来调用控制器操作

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

    你的控制器动作可以做

    Session["Menu"] == null
    

    如有必要,请检查并加载它。然后用

    返回一个部分
    return PartialView("_Partial");
    

    使用这种方法的好处是它可以让您从布局页面中获取检查 Session["Menu"] 的代码。

    我不确定这是否会有所帮助;如有必要,请进一步澄清您的问题。

    【讨论】:

    • 我在 _Layout.cshtml 中添加了 Html.Action("Action", "Controller") 替换 if (Session["Menu"] == null){ Session["Menu"] = Html.Partial (“_菜单”); } 为此 if (Session["Menu"] == null){ Html.Action("Menu","raLogin"); } 但我有错误 HttpException
    • Html.Action("Menu","raLogin") 更改为Html.RenderAction("Menu","raLogin"),因为您在代码块中。您遇到了什么错误?
    【解决方案2】:

    没有必要将 Html.Partial 操作的结果(即 MvcHtmlString)存储到 Session 中。只需使用例如方法创建MenuController CreateForRole 并致电:

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

    此方法应返回对已登录角色有效的视图。如果您现在确实想在每次调用时重新创建菜单(您应该这样做 - 假设您的用户在不注销的情况下被授予其他角色)并且您确实需要保留此调用,请改用以角色为参数的缓存。

    【讨论】:

    • 我添加了 {Html.RenderAction("CreateForRole","Menu")} 替换在我的 _Layout.cshtml Session["Menu"] = Html.Partial("_Menu");我有这个错误:代码用户无法控制 HttpException
    • 我想提供帮助,但请提供有关此错误的更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 2012-04-29
    • 2011-07-22
    • 1970-01-01
    • 2011-08-28
    • 2013-05-29
    • 2015-01-28
    • 2022-07-01
    • 1970-01-01
    相关资源
    最近更新 更多