带有Razor页面的ASP.NET Core MVC(无法从其他模型返回对象)

时间:2018-09-24 00:52:19

标签: c# razor asp.net-core-mvc razor-pages

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

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

我的Razor模型中的方法具有以下调用:

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

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

public TenantEntityModel Result { get; }

这使我可以在Razor视图中访问Result的属性。如果将断点放在return Page()语句之前,我可以看到Result对象具有我想要的属性。但是,呈现视图时,Model对象的Result属性为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 :(得分:1)

要在View中的PageModelRazor Page之间传递模型,您需要为已定义的模型public TenantEntityModel Result { get; set; }设置值,而不是定义新的对象{{1} }。

尝试将TenantEntityModel Result更改为:

OnGet()

答案 1 :(得分:1)

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