无法访问 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 页面