ASP.NET Core MVC with Razor Pages(不能 return 来自不同模型的对象)

ASP.NET Core MVC with Razor Pages (can't return object from a different model)

我正在使用我作为 Razor 页面模型 (cs) 文件的一部分创建的方法调用 Azure 表。结果的类型为 TenantEntityModel。我只想在我的视图中显示这些结果。

是否可以这样做?如果可以,我的 Razor 页面模型中需要包含什么?

我的 Razor 模型中的方法调用如下:

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

我以为我可以在视图中使用 @Model.Result.DomainName,但是没有引用此对象,因为 Result 在我的 Razor 模型中不存在。所以我尝试将它添加到我的 Razor 模型中:

public TenantEntityModel Result { get; }

这允许我在我的 Razor 视图中访问 Result 的属性。如果我在 return Page() 语句之前放置一个断点,我可以看到 Result 对象具有我想要的属性。但是,当呈现视图时,Model 对象的 Result 属性 为空,我得到:

NullReferenceException: Object reference not set to an instance of an object.

我也试过添加 BindProperty 如下:

[BindProperty]
public TenantEntityModel Result { get; }

...但这也没有用。因此,我不知道如何获取查询结果,使用来自不同 class 的模型填充对象,然后使用该对象的结果呈现页面。

查看代码:

@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();
    }

为了在Razor PageViewPageModel之间传递模型,您需要为定义的模型设置值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();
}

将您的 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();
    }
}