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 Page
中View
和PageModel
之间传递模型,您需要为定义的模型设置值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();
}
}
我正在使用我作为 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 Page
中View
和PageModel
之间传递模型,您需要为定义的模型设置值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();
}
}