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

Can't access Model items in Razor Page

希望试用 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);
    }

这会调用一个 SP,它在 SSMS

中处理 return 数据
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);
        }
        
        
    }
}

简单div里面IndexModel.cshtml

<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 进行测试,table 中的 3 行被写入控制台。问题是我得到了 'Object Reference not set to an instance of an object'

的 NullReference

当我没有正确处理模型并且它为空时,我在 EFCore 中遇到了类似的错误,但是,对于我来说,作为控制台的 return 行,我看不到模型是怎样的空。

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

@page 
@model IndexModel
@{
}

我认为这是完全由菜鸟错误引起的。

如果您在我的 DBAccess 中检查我的 LoadData 方法,它 return 是一个任务。我的 OnGet 设置为 void 但将其更改为

public async Task OnGet()
{
   forms = await _formData.GetCDItemForms();
}

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

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