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

标签 c# asp.net-core partial-views razor-pages

我目前正在学习 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/

相关文章:

c# - JArray.Contains 问题

c# - 了解连接字符串属性

.net - 本地开发环境中的 Azure WebJobs UseDevelopmentStorage=true

node.js - nodejs + jade,我们可以像在 ASP.NET 中那样渲染部分 View 吗?

asp.net-mvc-3 - 我怎样才能在 asp.net MVC 3 中制作可重用的局部 View

C# 公共(public)库

c# - 将小数转换为尽可能小的数字类型,不会丢失任何数据

c# - 如何将静态类从 .NET 迁移到 .NET Core?

jenkins - 在 docker 容器中使用 Jenkins 构建 ASP.NET 5

asp.net-mvc-2 - 如何使部分 View 可在不同 View 模型(asp.net mvc 2)之间重复使用?