【发布时间】:2018-09-02 22:01:43
【问题描述】:
我目前正在学习 ASP.net Core 2.0,特别是 Razor 页面。我目前正在尝试理解部分观点。
我有一个页面 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");
}
}
}
我尝试创建一个局部视图 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 中渲染部分视图,如下所示:
@await Html.PartialAsync("ExecRpt", Model.ExecRptModel)
我花了一段时间才让它正常工作而不会出错。
然后我转到局部视图的标记上。一旦我这样做将列表生成为 HTML:
@foreach (var item in Model.Logs)
{
<p>@Html.DisplayFor(i => item.ID)</p> //etc etc
}
我在调试时遇到了令人困惑的错误。
NullReferenceException:对象引用未设置为 对象。
错误是在我的局部视图模型中突出显示 @foreach 块。
现在我知道 Logs 模型应该返回大量数据,因为在不从局部视图调用时它可以正常工作。
请有人指出正确的方向吗?
【问题讨论】:
-
您的视图中声明了您的 ExecRptModel 模型吗?您可能希望在启动时将 Logs 初始化为一个空列表,因为加载可能是异步的。
标签: c# asp.net-core partial-views razor-pages