Asp.net mvc 4 使用MVC4在Web应用程序中进行动态布局

Asp.net mvc 4 使用MVC4在Web应用程序中进行动态布局,asp.net-mvc-4,Asp.net Mvc 4,我有一个MVC4/Entity web项目放在我的膝上,我以前从未使用过这两个项目。我已经挺过去了,但简单的事情真的让我大吃一惊——比如根据数据库中的参数在布局中隐藏或显示链接 我在HomeController中创建了一个函数,该函数只需在ViewBag中设置两个布尔值,以确定一个人是经理还是超级用户。我使用 @Html.Action("SetupViewBag", "Home") 它位于我的布局中的标记后面。以下是SetupViewBag的代码: public void SetupViewB

我有一个MVC4/Entity web项目放在我的膝上,我以前从未使用过这两个项目。我已经挺过去了,但简单的事情真的让我大吃一惊——比如根据数据库中的参数在布局中隐藏或显示链接

我在HomeController中创建了一个函数,该函数只需在ViewBag中设置两个布尔值,以确定一个人是经理还是超级用户。我使用

@Html.Action("SetupViewBag", "Home")
它位于我的布局中的
标记后面。以下是SetupViewBag的代码:

public void SetupViewBag()
{
   ViewBag.IsManager = ADAccess.IsManager(SessionManager.GetUserName());
   ViewBag.IsSuper = SessionManager.SuperUser();
}

当我设置断点时,bool设置正确,顺序正确,但是当我尝试使用下面的代码访问它们时,我得到一个“无法将null转换为bool”,因为它是不可为null的值类型。”

@{
   if((bool)@ViewBag.IsManager){                       
      <li>@Html.ActionLink("Management", "Management", "Home",null, new { id = "managementLink" })</li>
   }                     
}
@{
如果((bool)@ViewBag.IsManager){
  • @ActionLink(“管理”,“管理”,“主页”,空,新{id=“managementLink”})
  • } }

    一定有一些很简单的东西我错过了。非常感谢您的帮助。

    我希望这对您有用,请再试一次 @ActionLink(“管理”、“管理”、“主页”,新的{id=false},空)


    谢谢

    我希望这对你有用,请再试一次 @ActionLink(“管理”、“管理”、“主页”,新的{id=false},空)


    谢谢

    根据您的评论@Dakine83,您应该在控制器构造函数方法上设置ViewBag,如下所示:

    public class YourController : BaseController {
        public YourController(){
    
        }
    }
    
    这是因为在调用操作方法时布局页面已经呈现。您拥有空的
    ViewBag.IsManager
    的原因

    更新:使用基本控制器

    public class BaseController : Controller {
        public BaseController() {
                ViewBag.IsManager = ADAccess.IsManager(SessionManager.GetUserName());
        }
    }
    

    根据您的评论@Dakine83,您应该在控制器构造函数方法上设置ViewBag,如下所示:

    public class YourController : BaseController {
        public YourController(){
    
        }
    }
    
    这是因为在调用操作方法时布局页面已经呈现。您拥有空的
    ViewBag.IsManager
    的原因

    更新:使用基本控制器

    public class BaseController : Controller {
        public BaseController() {
                ViewBag.IsManager = ADAccess.IsManager(SessionManager.GetUserName());
        }
    }
    

    当你说“布尔值设置正确”时,你的意思是你的代码中有
    ViewBag.IsManager=true
    (或false)?如果在视图中没有使其为空的if-else,则更新了带有SetupViewBag代码的问题。当我在SetupViewBag内部和if((bool)@ViewBag.IsManager){行上设置断点时,ViewBag.IsManager在被引用之前被设置。但是,它在布局文件中被引用,而不是视图本身,我认为这是我在进行研究后遇到的问题。当你说“bools设置正确”时您的意思是您的代码中有
    ViewBag.IsManager=true
    (或false)?并且您没有将其包含在if-else中,这将使其在视图中为空?更新了带有SetupViewBag代码的问题。当我在SetupViewBag和if((bool)@ViewBag.IsManager)中设置断点时{line,ViewBag.IsManager是在被引用之前设置的。但是,它是在布局文件中被引用的,而不是视图本身,我认为这是我正在进行的研究后的问题。链接工作正常-检查是否应该显示链接正在断开。我得到一个“无法将null转换为”bool“,因为它是不可为null的值类型我认为您已经提到了上述问题,如果您设置新的{id=true/false},它将得到解决因为actin方法中的参数是bool类型。“cannot convert”不是来自该行。该行在没有if的情况下按预期工作。该链接工作正常-检查是否应该显示该链接正在中断。我得到一个“cannot convert null to'bool”,因为它是一个不可为null的值类型,我认为您可以我已经提到了上述问题,如果您设置新的{id=true/false},它将得到解决因为actin方法中的参数是bool类型。“无法转换”不是来自该行。该行在没有if的情况下按预期工作。这就是我担心的。是不是我的8个控制器上都有完全相同的函数的唯一选项?这看起来很可笑,但并不奇怪。不,你可以,我建议“应该有”,一个基本控制器。看到我更新的答案。这就是我害怕的。这是我的8个控制器中每个控制器都有完全相同功能的唯一选项吗?这看起来很可笑,但并不奇怪。不,你可以有,我建议“应该有”,一个基本控制器。看到我更新的答案。