无法访问 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 问题导致的。
如果没有我说的那么简单,请随时向我解释。
希望试用 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 问题导致的。
如果没有我说的那么简单,请随时向我解释。