无法访问 Razor 页面中的模型项目

Posted

技术标签:

【中文标题】无法访问 Razor 页面中的模型项目【英文标题】:Can't access Model items in Razor Page 【发布时间】:2022-01-10 18:36:14 【问题描述】:

希望尝试将 Dapper 作为 EFCore 的可能替代品。

我有一个简单的

型号

public class CDItemFormModel

    public int Id  get; set; 
    public string ItemForm  get; set; 
    public bool Active  get; set; 

SQL 数据库访问

public async Task<IEnumerable<T>> LoadData<T, U>(string storedProcedure, U parameters, string connectionId = "Default")
    
        using IDbConnection connection = new SqlConnection(_config.GetConnectionString(connectionId));

        return await connection.QueryAsync<T>(storedProcedure, parameters, commandType: CommandType.StoredProcedure);
    

这会调用一个在 SSMS 中返回数据的 SP

public class CDItemFormData : ICDItemFormData

    private readonly ISQLDataAccess _db;

    public CDItemFormData(ISQLDataAccess db)
    
        _db = db;
    
    // Get all Drug Forms
    public Task<IEnumerable<CDItemFormModel>> GetCDItemForms() => _db.LoadData<CDItemFormModel, dynamic>("Products.spCDItemForm_GetAll", new  );

在测试时,我只是针对 IndexModel 运行

public class IndexModel : PageModel

    private readonly ILogger<IndexModel> _logger;
    private readonly IConfiguration _configuration;
    private readonly ICDItemFormData _formData;
    
    public IEnumerable<CDItemFormModel> forms;
    
    public IndexModel(ILogger<IndexModel> logger, IConfiguration configuration, ICDItemFormData formData)
    
        _logger = logger;
        _configuration = configuration;
        _formData = formData;
    

    

    public async void OnGet()
            
        forms = await _formData.GetCDItemForms();
        
        foreach( var item in forms)
        
            Console.WriteLine(item.ItemForm);
        
        
        
    

IndexModel.cshtml 中的简单 div

<div>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Form</th>
                <th>Active</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.forms)
            
                <tr>
                    <td>
                        @item.Id
                    </td>
                    <td>
                        @item.ItemForm
                    </td>
                    <td>
                        @item.Active
                    </td>
                </tr>
            
        </tbody>
        
    
    </table>
</div>

我将 foreach 添加到 IndexModel 进行测试,并将表中的 3 行写入控制台。问题是我得到一个 NullReference 为“对象引用未设置为对象的实例”

当我没有正确处理模型并且它为空时,我在 EFCore 中遇到了类似的错误,但是,当行返回到我的控制台时,我看不到模型是如何为空的。

【问题讨论】:

哪条线路在抛出 NRE? @gunr2171 cshtml 文件中 foreach 的开始。页面模型中的 foreach 不会抛出 NRE。 【参考方案1】:

尝试将模型添加到您的索引视图页面

@page 
@model IndexModel
@

【讨论】:

【参考方案2】:

我认为这是一个完全的菜鸟错误造成的。

如果您检查我的 DBAccess 中的 LoadData 方法,它会返回一个任务。我的 OnGet 设置为无效,但将其更改为

public async Task OnGet()

   forms = await _formData.GetCDItemForms();

已修复该问题,cshtml foreach 现在显示每个返回的行。我已经对 GetCDItemForm(1) 的单次返回进行了测试,它也正确显示。我不得不假设是我的 Void/Task 问题导致了它。

如果没有我说的那么简单,请随时向我解释。

【讨论】:

以上是关于无法访问 Razor 页面中的模型项目的主要内容,如果未能解决你的问题,请参考以下文章

创建基于ASP.NET core 3.1 的RazorPagesMovie项目-应用模型类配合基架生成工具生成Razor页面

如何从 Blazor WebAssembly 中的 Razor 页面访问 body 标签或其他标签?

无法在默认 Blazor 服务器端项目中找到 Razor 页面

无法访问 Gatsby 页面查询中的对象数据

如何在 asp.net core .NET6(Razor 页面)中的单个 cshtml 中显示来自多个表/模型的数据

.NET Core 无法添加 Razor 页面