Использование MVC 5 IsInRole в представлениях Razor: невозможно подключиться к базе данных

У меня проблемы с использованием новой системы идентификации в MVC 5, моя цель — использовать User.IsinRole("RoleName") в представлениях. Например:

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

Он помещается на главную страницу макета, которая открывается при запуске приложения. При этом я получаю следующую ошибку:

"Исключение типа "System.Web.HttpException" возникло в System.Web.dll, но не было обработано в коде пользователя

Дополнительная информация: невозможно подключиться к базе данных SQL Server».

Я искал решение этой проблемы повсюду, обычное решение состоит в том, чтобы либо включить «[InitializeSimpleMembership]» в верхней части контроллера, либо инициализировать соединение с базой данных вручную при запуске приложения. (С WebSecurity.InitializeDatabaseConnection). Оба эти метода, похоже, не распознаются MVC 5.

Я также пытался обойти это, создавая кучу беспорядочного кода каждый раз, когда я возвращаю представление для заполнения ViewBag логическим значением IsAdmin, используя Aspnet.Identity.UserManager для определения ролей. Хотя это работает, я чувствую, что не должен делать что-то.

Возможно, стоит отметить, но я не испытываю этих проблем с доступом к User.IsInRole на серверной части, это определенно похоже на проблему инициализации.


person Stunt    schedule 08.11.2013    source источник
comment
Невозможно подключиться к базе данных SQL Server — это проблема с ConnectionString. Убедитесь, что у вас есть правильная строка подключения, и вы можете подключиться к базе данных, используя ее.   -  person jd4u    schedule 10.11.2013
comment
User.IsInRole отлично работает на контроллерах, это происходит только в представлениях. Для меня это исключает строку подключения.   -  person Stunt    schedule 10.11.2013
comment
Я не могу воспроизвести вашу проблему. Я создаю приложение MVC из шаблонов VS2013, выбираю «Индивидуальные учетные записи» и добавляю предоставленный вами код в мой файл _Layout.cs. Работает отлично. Нет необходимости в какой-либо специальной инициализации. Вы уверены, что именно вызов User.IsInRole вызывает исключение? Вы проверили трассировку стека, чтобы найти, где именно возникает это исключение?   -  person Olav Nybø    schedule 10.11.2013
comment
Олав, я просмотрел трассировку стека, и похоже, что он пытается создать локальную БД: в System.Web.DataAccess.SqlConnectionHelper.CreateMdfFile(String fullFileName, String dataDir, String connectionString) Моя разница с вами в этом Дело в том, что я подключил свой MVC к локальной базе данных SQL2013. В этом ли проблема?   -  person Stunt    schedule 11.11.2013
comment
Извините, что следует читать SQL2012, конечно, опечатка!   -  person Stunt    schedule 12.11.2013
comment
У меня та же проблема - очень глупо, я не использую EF или что-то в этом роде - я просто хочу, чтобы IsInRole вел себя нормально, а не пытался создать/использовать базу данных для ее определения, я уже подключил контекст/роли пользователей и т. д. - очень глупая проблема   -  person schmoopy    schedule 17.11.2013
comment
Тебе уже удалось добиться чего-нибудь с этим, придурок?   -  person Stunt    schedule 21.11.2013


Ответы (3)


У меня была та же проблема, однако ответ Stunt у меня не работал. Пробовал ответ на этот вопрос и это решило проблему.

Для ленивых вы можете попробовать добавить это в свой файл web.config:

 <system.webServer>
    <modules>
      <remove name="RoleManager" />
    </modules>
  </system.webServer>
person grimurd    schedule 27.12.2013
comment
Это решило мою проблему. У меня ничего не работало. Это должно быть помечено как ответ. - person Geethanga; 23.01.2014
comment
Мне пришлось удалить это из моей конфигурации, чтобы все заработало! - person Chris; 31.03.2014
comment
Это сработало и для меня, но не знаю почему, я сделал предыдущий проект MVC с различными версиями и никогда раньше не использовал этот фрагмент XML. Тем не менее спасибо - person nityan; 16.11.2014
comment
У меня возникла та же проблема, когда я открыл свой старый проект в сообществе Visual Studio 2015. Это мифическим образом решило проблему. Спасибо. - person Vaclav Elias; 31.07.2015
comment
Обновлял веб-сайт с Asp.Net MVC 4 до Asp.Net MVC 5. Была эта проблема. У меня сработало обновление файла web.config. - person user2347528; 30.01.2016
comment
Моя бедная собака благодарит вас. Он не может понять, почему я так кричал на компьютер. Можете ли вы объяснить, почему это работает, когда узел <roleManager/> удален? Какая-то «умная» инъекция зависимостей? - person Simon_Weaver; 14.12.2017
comment
Обязательно добавьте узел remove под modules, а не httpModules - person Simon_Weaver; 14.12.2017
comment
Благодарю вас! Это также решило проблему для меня, которая внезапно появилась сегодня после отличной работы в течение последних 12 месяцев. Я также использовал один и тот же код в течение последних 10 лет, и никогда не возникало проблем. Есть идеи, почему это так? Совпадение может быть в том, что я добавил ссылку на system.web.helper в отдельный проект в решении. - person Toad; 29.07.2019

Мне удалось обойти проблему, удалив следующую строку из моей веб-конфигурации:

<roleManager enabled="true" />

Это было обнаружено при сравнении строки за строкой в ​​следующем примере кода:

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

person Stunt    schedule 24.11.2013
comment
Почему это работает? У меня была та же проблема, что и у вас, и я изначально поместил эту строку в свой web.config только потому, что мне было сказано в руководстве MSDN. - person John Shedletsky; 30.06.2015

Создание базы данных при запуске приложения. Добавьте следующее в Global.ascx с вашим dbcontext.

using (FooContext db = new FooContext()) 
        {
            db.Database.CreateIfNotExists();
        }
person Purushoth    schedule 30.01.2014