gpt4 book ai didi

c# - Razor Pages - 部分 View 和从模型获取数据的问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:29 25 4
gpt4 key购买 nike

我目前正在学习 ASP.net Core 2.0,特别是 Razor 页面。我目前正在尝试了解部分 View 。

我有一个页面 ViewReport,它主要显示报告的数据并允许用户对其进行编辑。该模型如下所示:

    namespace ReportControlPanel.Pages
{
public class ViewReportModel : PageModel
{
private readonly ReportControlPanel.Data.MainContext _context;

public ViewReportModel(ReportControlPanel.Data.MainContext context)
{
_context = context;
}

[BindProperty]
public Reports Reports { get; set; }
[BindProperty]
public ExecRptModel ExecRptModel { get; set; }

public async Task<IActionResult> OnGetAsync(int? id)
{
if (id == null)
{
return NotFound();
}

Reports = await _context.ReportContents
.SingleOrDefaultAsync(m => m.ID == id);


if (Reports == null)
{
return NotFound();
}
return Page();

}

public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}

_context.Attach(Reports).State = EntityState.Modified;

try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{

}

return RedirectToPage("./Index");
}
}
}

我尝试创建一个局部 View ExecRpt,它将显示该报告的报告执行日志。该模型如下所示:

namespace ReportControlPanel.Pages
{
public class ExecRptModel
{
private readonly ReportControlPanel.Data.MainContext _context;

public ExecRptModel(ReportControlPanel.Data.MainContext context)
{
_context = context;
}

public IList<Logs> Logs { get; set; }

public async Task OnGetAsync()
{
IQueryable<Logs> LogsIQ = from i in _context.vwReportLogs select i;

Logs = await LogsIQ.ToListAsync();

}
}
}

我在 ViewReport.cshtml 中渲染局部 View 是这样的:

@await Html.PartialAsync("ExecRpt", Model.ExecRptModel)

我花了一段时间才没有出错。

然后我转到局部 View 的标记上。一旦我这样做将列表生成为 HTML:

@foreach (var item in Model.Logs)
{
<p>@Html.DisplayFor(i => item.ID)</p> //etc etc
}

我在调试时遇到了令人困惑的错误。

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

错误是在我的部分 View 模型中突出显示 @foreach block 。

现在我知道日志模型应该返回数据负载,因为当不从局部 View 调用时它工作正常。

有人能指出我正确的方向吗?

最佳答案

您的类 ExecRptModel 包含一个名为 OnGetAsync() 的方法。这是 PageModel 派生类(即 Razor Pages 的代码隐藏)所采用的模式。它不适用于部分 View 。我确定您仍然可以像任何其他常规方法一样调用 OnGetAsync() ,但不要期望它会在首次呈现局部 View 时自动调用(尝试设置断点并查看是否有任何代码被执行).因此,我怀疑您遇到了空引用异常,因为 Logs 从未设置为任何内容,因此当您尝试在 View 中对其进行迭代时它为空。

我建议将获取日志的逻辑移动到 ExecRptModel 的构造函数中。或者,考虑使用 View Components ,这将允许您在呈现组件时执行更复杂的数据获取逻辑。

关于c# - Razor Pages - 部分 View 和从模型获取数据的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49462999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com