ASP.NET Core MVC с Razor Pages (не может вернуть объект из другой модели) - PullRequest
0 голосов
/ 24 сентября 2018

Я обращаюсь к таблицам Azure в методе, который я создал как часть файла модели (cs) страницы Razor.Результаты имеют тип TenantEntityModel.Я хотел бы просто отобразить эти результаты в своем представлении.

Возможно ли это сделать, и если да, что должно быть в моей модели страницы Razor?

Метод в моем RazorМодель имеет следующий вызов:

TenantEntityModel Result = await azureTableConnection.TenantLookupAsync(azureTableConnection, domainName, id);

Я думал, что мог бы просто использовать @Model.Result.DomainName в представлении, однако нет ссылки на этот объект, поскольку Result не существовало в моей модели Razor.Поэтому я попытался добавить его в свою модель Razor следующим образом:

public TenantEntityModel Result { get; }

Это позволяет мне получить доступ к свойствам Result в моем представлении Razor.Если я поставлю точку останова перед оператором return Page(), я увижу, что у объекта Result есть свойства, которые мне нужны.Однако когда представление отображается, свойство Result объекта Model имеет значение null, и я получаю:

NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта.

Я также попытался добавить BindProperty следующим образом:

[BindProperty]
public TenantEntityModel Result { get; }

... но это тоже не сработало.Так что я не знаю, как получить результаты запроса, заполнить объект моделью из другого класса, а затем отобразить страницу с результатами этого объекта.

Просмотр кода:

@page
@model ApiKeyModel
@if (@Model.Result.ApiKey == null)
            {
                //show the button
                <button name="CreateApiKey" type="submit" class="btn btn-primary">Create new API Key</button>
            }

Код контроллера:

public class ApiKeyModel : PageModel
{
    private readonly UserManager<UserRegistrationExtension> _userManager;
    private readonly ILogger<PersonalDataModel> _logger;

    [BindProperty]
    public TenantEntityModel Result { get; set; }

    public ApiKeyModel(
        UserManager<UserRegistrationExtension> userManager,
        ILogger<PersonalDataModel> logger)
    {
        _userManager = userManager;
        _logger = logger;
    }

    public async Task<IActionResult> OnGet()
    {
        // need to validate if account exists first
        var user = await _userManager.GetUserAsync(User);
        if (user == null)
        {
            return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
        }

        var domainName = user.Office365DomainName;
        var id = user.Id;
        AzureTableConnection azureTableConnection = new AzureTableConnection();
        TenantEntityModel Result = await azureTableConnection.TenantLookupAsync(azureTableConnection, domainName, id);

        return Page();
    }

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Измените свой код PageModel на это.Вы создавали локальную переменную TenantEntityModel Result вместо присвоения значения свойству.

public class ApiKeyModel : PageModel
{
    private readonly UserManager<UserRegistrationExtension> _userManager;
    private readonly ILogger<PersonalDataModel> _logger;

    [BindProperty]
    public TenantEntityModel Result { get; set; }

    public ApiKeyModel(
        UserManager<UserRegistrationExtension> userManager,
        ILogger<PersonalDataModel> logger)
    {
        _userManager = userManager;
        _logger = logger;
    }

    public async Task<IActionResult> OnGet()
    {
        // need to validate if account exists first
        var user = await _userManager.GetUserAsync(User);
        if (user == null)
        {
            return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
        }

        var domainName = user.Office365DomainName;
        var id = user.Id;
        AzureTableConnection azureTableConnection = new AzureTableConnection();
        Result = await azureTableConnection.TenantLookupAsync(azureTableConnection, domainName, id);

        return Page();
    }
}
0 голосов
/ 24 сентября 2018

Для передачи модели между View и PageModel в Razor Page вам нужно установить значение для определенной модели public TenantEntityModel Result { get; set; } вместо определения нового объекта TenantEntityModel Result.

Попробуйте изменить OnGet() на:

public async Task<IActionResult> OnGet()
{
    // need to validate if account exists first
    var user = await _userManager.GetUserAsync(User);
    if (user == null)
    {
        return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
    }

    var domainName = user.Office365DomainName;
    var id = user.Id;
    AzureTableConnection azureTableConnection = new AzureTableConnection();
    Result = await azureTableConnection.TenantLookupAsync(azureTableConnection, domainName, id);

    return Page();
}
...