Наследование базовых контроллеров в удостоверении ASP.NET Core - PullRequest
0 голосов
/ 05 мая 2019

Я только начал свой первый проект в ядре asp net и перехожу с .Net Framework.

Я создал новый проект с использованием ASP.NET Core 2.1 и добавил Identity через

Right click on project -> Add -> Add scaffolded items

к моему проекту.

Прежде всего, что-то меня смущает. Все файлы для идентификации перемещены в область, называемую «Файлы разделов идентификации и управления» и перемещены в папку «Аккаунт». Самое главное, у меня нет учетной записи и я не могу управлять контроллерами

Я создал новый пустой контроллер с именем BaseController:

public class BaseController : Controller
{
    private ApplicationDbContext _db { get; set; }

    public BaseController(ApplicationDbContext db)
    {
        _db = db;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (HttpContext.User.Identity.IsAuthenticated)
        {
            string userEmail = User.Identity.Name;                
            ViewBag.CurrentUser = _db.Users.Where(u => u.Email.Equals(userEmail)).FirstOrDefault();
        }

        base.OnActionExecuting(filterContext);
    }
}

В этом контроллере я получаю зарегистрированного пользователя и передаю его ViewBag и показываю его в моем представлении.

У меня есть HomeController, который наследуется от BaseController:

public class HomeController : BaseController
{
    private UserManager<ApplicationUser> _userManager { get; set; }
    private readonly ApplicationDbContext _db;

    public HomeController(UserManager<ApplicationUser> userManager, 
                          ApplicationDbContext db) : base (db)
    {
        _userManager = userManager;
        _db = db;
    }

    public IActionResult Index()
    {
        return View();
    }

    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    public IActionResult Error()
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
}

Эта часть кода работает нормально, но когда я пытаюсь перейти к Manage/Index или Manage/ChangePassword, я получаю эту ошибку и не знаю, как решить эту проблему. Причиной этой ошибки является то, что ViewBag пуст, поскольку действие базового контроллера никогда не выполняется.

Извините, если мой вопрос простой и не профессиональный

1 Ответ

0 голосов
/ 06 мая 2019

В ядре asp.net 2.1 в идентификации скаффолда используется Razor Pages , а не структура MVC, поэтому в области Identity нет контроллеров, и вы не можете наследовать контроллер.См. здесь .

Поскольку он находится в области, вам нужно использовать URL, например, https://localhost:44367/Identity/Account/Manage/Index или https://localhost:44367/Identity/Account/Manage/ChangePassword для доступа к страницам бритвы.

Кроме того, ViewBag не поддерживается в Razor Pages, вместо этого можно использовать ViewData, см. здесь .

Чтобы добавить фильтры для Razor Pages, вы можете обратиться к Фильтры в RazorСтраницы

public class BasePageModel : PageModel
{
    public override void OnPageHandlerExecuting(PageHandlerExecutingContext context)
    {
        //...
    }
}
public class IndexModel : BasePageModel
{
    public void OnGet()
    {
        //...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...