0

在我的应用程序中,我有几个区域(视图),只有具有特定权限的用户才能访问这些区域(视图)。如果当前登录的用户没有权利看到给定的视图,应该出现一个弹出窗口。在这一刻,用户可以提供一些额外的信息,以便查看视图。重点在于用户不能离开当前视图,直到他/她提供此信息。到目前为止,我认为我可以这样做。首先我定义了自定义的AuthorizeAttribute。该属性应用于负责保护受限视图的控制器。我的属性看起来像这样ASP.NET MVC - 传递附加凭证的模式窗口

public class PopupAuthorizeAttribute : AuthorizeAttribute 
    { 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 

      if (filterContext.HttpContext.Session["confirmed"] == null) 
      { 
       filterContext.Controller.ViewData["ShowPopup"] = true; 
      } 
      else 
       filterContext.Controller.ViewData["ShowPopup"] = false; 
     } 
    } 

接下来我修改_Layout.cshtml看这样

... 
... 
<body> 
    <div id="main"> 
      @{ 
       if ((ViewData[ShowPopup] != null && (bool)ViewData[ShowPopup])) 
       { 
       <script type="text/javascript"> 
        showPopUp(); 
       </script> 
       } 
      } 
     <div id="header"> 
      title 
     </div> 
     <div id="menu"> 
      @{ 
       Html.RenderAction("TopMenu", "Menu"); 
      } 
     </div> 
     <div id="treeView"> 
      @{ 
       Html.RenderAction("TreeMenu", "Tree"); 
      } 
     </div> 
     <div id="content"> 

      @RenderBody() 
     </div> 
    </div> 
</body> 
... 
... 

可惜的是,结果比我预料的不同。现在,渲染用户无法访问的视图并显示弹出窗口。我想当前视图重定向到前一个在我的自定义属性做这样的

public class PopupAuthorizeAttribute : AuthorizeAttribute 
     { 
      public override void OnAuthorization(AuthorizationContext filterContext) 
      { 

       if (filterContext.HttpContext.Session["confirmed"] == null) 
       { 
        filterContext.Controller.ViewData["ShowPopup"] = true; 
        filterContext.Result = 
        new RedirectResult(filterContext.RequestContext.HttpContext.Request.UrlReferrer.ToString()); 

       } 
       else 
        filterContext.Controller.ViewData["ShowPopup"] = false; 
      } 
     } 

做某事但如果我这样做,我losse存储在ViewData的信息。有没有任何优雅或更好的方法来实现这一功能。不幸的是,我无法将用户重定向到“正常”页面,这必须在popupwindow中完成。

回答

0

存储在ViewData中的信息在重定向到另一个操作后将丢失。如果您希望信息持续存在,则可以使用TempData []。

然而,为了更好地维护您的需求,我将使用基于角色的授权方案。在你的情况下,你的控制器会检查用户是否有正确的角色来查看页面的某些部分,并将这些信息存储在ViewData/ViewBag中(通过User.IsInRole(“Administrator”)等)。您的视图将基于ViewData/ViewBag中的信息构建自己。

要设置这是相当一部分工作,你将不得不做一些谷歌搜索找到适当的教程。

这是一个我发现,似乎不错: http://weblogs.asp.net/scottgu/archive/2006/07/23/Recipe_3A00_-Implementing-Role-Based-Security-with-ASP.NET-using-Windows-Authentication-and-SQL-Server.aspx

简而言之web.config文件需要有类似于下面的东西,当你完成:

<roleManager enabled="true" defaultProvider="YourRoleProvider"> 
     <providers> 
      <clear /> 
      <add name="YourRoleProvider" 
       applicationName="YourApplicationName" 
       type="YourProject.Models.YourRoleProvider" 
       connectionStringName="YourDatabaseConnectionString" /> 
     </providers> 
    </roleManager> 
+0

主要得益于我的角色就​​像一个角色提供者。真正的问题是找出如何显示popWindow的方式。正常的角色提供程序我将被重定向到登录页面,但我想在当前视图上显示一个弹出窗口 – Berial 2012-02-08 21:05:34

+0

实际上,重定向和登录身份验证由您的MembershipProvider处理。有很多方法可以在视图上显示“弹出”窗口,我更关心如何确定“弹出”窗口是否应显示在我的答案中。显示模式弹出窗口的一种方法是使用jQuery UI库。里面有Dialog控件,我用它之前它很好。 – 2012-02-08 21:16:36