【问题标题】:MVC 5 IsInRole Usage on Razor Views: Cannot connect to Database剃刀视图上的 MVC 5 IsInRole 用法:无法连接到数据库
【发布时间】:2013-11-21 03:10:33
【问题描述】:

我在使用 MVC 5 中的新身份系统时遇到问题,我的目标是在视图上使用 User.IsinRole("RoleName")。例如:

@if(User.IsInRole("Administrator"))
 {
   <li>@Html.ActionLink("Admin", "Index", "Admin")</li>
 }

这是放置在应用程序启动时点击的主布局页面中。在这样做时,我收到以下错误:

“System.Web.dll 中发生了‘System.Web.HttpException’类型的异常,但用户代码中没有处理

附加信息:无法连接到 SQL Server 数据库。”

我已经到处寻找解决方案,常见的解决方案是在控制器顶部包含“[InitializeSimpleMembership]”或在应用程序启动时手动初始化数据库连接。 (使用 WebSecurity.InitializeDatabaseConnection)。这两种方法似乎都无法被 MVC 5 识别。

我还尝试通过创建一堆乱七八糟的代码来解决这个问题,只要我返回一个视图,通过使用 Aspnet.Identity.UserManager 来确定角色,用 IsAdmin 布尔值填充 ViewBag。虽然这行得通,但这不是我觉得我应该做的事情。

这可能值得注意,但我在后端访问 User.IsInRole 时没有遇到这些问题,这肯定是初始化问题。

【问题讨论】:

  • “无法连接到 SQL Server 数据库”是 ConnectionString 的问题。确保您有正确的连接字符串,并且您能够使用它连接到 Db。
  • User.IsInRole 在控制器上工作得非常好,这只发生在视图上。对我来说,这排除了连接字符串。
  • 我无法重现您的问题。我从 VS2013 模板创建一个 MVC 应用程序,选择个人帐户并将您提供的代码添加到我的 _Layout.cs 文件中。工作正常。不需要任何特殊的初始化。您确定是 User.IsInRole 调用导致了异常吗?您是否检查了堆栈跟踪以找到它引发异常的确切位置?
  • Olav,我查看了堆栈跟踪,看起来它正在尝试创建本地数据库:“在 System.Web.DataAccess.SqlConnectionHelper.CreateMdfFile(String fullFileName, String dataDir, String connectionString)" 我与您的不同之处在于我已将 MVC 连接到本地 SQL2013 DB。这就是问题所在吗?
  • 对不起,当然应该读 SQL2012,错字!

标签: sql-server asp.net-mvc authorization asp.net-mvc-5 asp.net-identity


【解决方案1】:

我遇到了同样的问题,但是 Stunt 的回答对我不起作用。尝试了this question 的答案并解决了问题。

对于懒惰的人,您可以尝试将其添加到您的 web.config 文件中:

 <system.webServer>
    <modules>
      <remove name="RoleManager" />
    </modules>
  </system.webServer>

【讨论】:

  • 这解决了我的问题。没有什么对我有用。这应该被标记为答案。
  • 我必须从我的配置中删除它才能正常工作!
  • 这对我也有用,但不知道为什么,我以前制作了具有各种版本的 MVC 项目,并且以前从未使用过那个 XML sn-p。不过还是谢谢
  • 我在 Visual Studio 2015 社区中打开旧项目时遇到了同样的问题。这神话般地解决了这个问题。谢谢。
  • 我可怜的狗谢谢你。他不明白我为什么对着电脑大吼大叫。你能解释一下为什么在删除&lt;roleManager/&gt; 节点时这会起作用吗?某种“聪明”的依赖注入?
【解决方案2】:

我设法通过从我的 Web Config 中删除以下行来解决这个问题:

<roleManager enabled="true" />

在以下示例代码中逐行比较后发现:

https://github.com/rustd/AspnetIdentitySample/tree/master/AspnetIdentitySample

【讨论】:

  • 为什么会这样?我和你有同样的问题,我最初只是把这行放在我的 web.config 中,因为 MSDN 教程告诉我这样做。
【解决方案3】:

在应用程序启动时创建数据库。在您的 dbcontext 中添加以下 Global.ascx。

using (FooContext db = new FooContext()) 
        {
            db.Database.CreateIfNotExists();
        }

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2021-10-28
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多