ASP Net Core - универсальные модели страниц - PullRequest
1 голос
/ 22 июня 2019

Я начинаю изучать программирование с ASP Net Core. Проводя некоторое время с Asp Net Core Identity, я хотел создать собственную страницу входа в систему для целей обучения. К сожалению, теперь у меня есть некоторые проблемы, чтобы понять, как работает внедрение зависимостей, если вы хотите использовать модель страницы, которая включает общий параметр, такой как Login.cshtml.cs из Asp Net Core Identity. В исходном коде есть два класса, которые являются производными от модели страницы для страницы входа:

[AllowAnonymous]
[IdentityDefaultUI(typeof(LoginModel<>))]
public abstract class LoginModel : PageModel

и

internal class LoginModel<TUser> : LoginModel where TUser : class

Я прочитал, что класс SignInManager управляет процессом входа и выхода в Identity. Но поэтому я думаю, что я должен использовать внутренний класс. Но я не понимаю, как идентификаторы Asp Net Core использовать внутренний класс вместо абстрактного или, может быть, он делает?!

Даже на странице бритвы в качестве модели используется только абстрактный класс:

@page
@model LoginModel
@{
ViewData["Title"] = "Log in";
}

Есть ли кто-нибудь, кто может объяснить мне, что я должен сделать, чтобы иметь возможность использовать универсальный параметр для модели страницы, как это делает внутренний класс LoginModel? Я думаю, что это может быть очень полезно и для некоторых других случаев.

1 Ответ

0 голосов
/ 22 июня 2019

Я думаю, что нашел решение для моей проблемы. Внутренний класс, кажется, инициализируется соглашением PageModel, которое можно найти в исходном файле IdentityPageModelConvention:

public void Apply(PageApplicationModel model)
    {
        var defaultUIAttribute = model.ModelType.GetCustomAttribute<IdentityDefaultUIAttribute>();
        if (defaultUIAttribute == null)
        {
            return;
        }

        ValidateTemplate(defaultUIAttribute.Template);
        var templateInstance = defaultUIAttribute.Template.MakeGenericType(typeof(TUser));
        model.ModelType = templateInstance.GetTypeInfo();
    }

Похоже, этот метод определяет внутренний класс с универсальным свойством TUser по атрибуту IdentityDefaultUI, который определен в абстрактном классе LoginModel:

[IdentityDefaultUI(typeof(LoginModel<>))]
public abstract class LoginModel : PageModel
...