根据MVC4中的条件动态加载布局

时间:2013-12-31 05:22:18

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

我有一个_Layout.cshtml页面,每次加载视图时都会呈现。我有一个存储当前用户的会话变量。在加载视图时,我需要检查该会话是否已经完成。如果会话输出我需要渲染另一个视图以提示用户再次登录。

我已经在_Layout.cshtml中编写了这段代码

  @if( @Session["UserId"]!=null)
        {/* Header,RenderBoady(),footer etc of layout goes here */}
        else 
{/*call another view here*/}

我不知道在 else 部分需要写什么。

2 个答案:

答案 0 :(得分:2)

最有可能的是,您需要重定向用户而不是改变布局。我建议使用过滤器来完成这项任务,并考虑2个解决方案。

首先,利用内置的[Authorize]属性来减少自定义逻辑的数量 其次,使用自定义AuthorizeFilter,它可能如下所示:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
  public override void OnAuthorization(AuthorizationContext filterContext)
  {
    Controller controller = filterContext.Controller as Controller;

    if (IsSessionExpired(filterContext))
    {
      filterContext.Result = new RedirectResult(<where to redirect>);
    }
  }

  private bool IsSessionExpired(AuthorizationContext filterContext)
  {
    <logic>
  }
}

选择您喜欢的任何内容并注册为全局过滤器或标记特定的控制器/操作。

答案 1 :(得分:1)

  1. 使用asp.net mvc authorze过滤器属性进行用户身份验证,
  2. 在web.config中启用表单身份验证
  3. 使用_ViewStart.cshtml并在该文件中执行此检查。根据状态设置登录用户和已注销用户的布局页面

    @{
      if( @Session["UserId"]!=null)
       {
          Layout = "~/Views/Shared/_Layout.cshtml";
       }
       else
       {
         Layout = "~/Views/Shared/_LayoutPartial.cshtml";
       }
    }