Не удается получить доступ к элементам модели на странице Razor

#c# #asp.net #razor-pages

Вопрос:

Хотите попробовать Dapper в качестве возможной замены EFCore.

У меня есть простое

Модель

 public class CDItemFormModel {  public int Id { get; set; }  public string ItemForm { get; set; }  public bool Active { get; set; } }  

Доступ к базе данных SQL

 public async Tasklt;IEnumerablelt;Tgt;gt; LoadDatalt;T, Ugt;(string storedProcedure, U parameters, string connectionId = "Default")  {  using IDbConnection connection = new SqlConnection(_config.GetConnectionString(connectionId));   return await connection.QueryAsynclt;Tgt;(storedProcedure, parameters, commandType: CommandType.StoredProcedure);  }  

Это вызывает SP, который возвращает данные в SSMS

 public class CDItemFormData : ICDItemFormData {  private readonly ISQLDataAccess _db;   public CDItemFormData(ISQLDataAccess db)  {  _db = db;  }  // Get all Drug Forms  public Tasklt;IEnumerablelt;CDItemFormModelgt;gt; GetCDItemForms() =gt; _db.LoadDatalt;CDItemFormModel, dynamicgt;("Products.spCDItemForm_GetAll", new { }); }  

Во время тестирования я просто работаю с моделью индекса

 public class IndexModel : PageModel {  private readonly ILoggerlt;IndexModelgt; _logger;  private readonly IConfiguration _configuration;  private readonly ICDItemFormData _formData;    public IEnumerablelt;CDItemFormModelgt; forms;    public IndexModel(ILoggerlt;IndexModelgt; 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

 lt;divgt;  lt;tablegt;  lt;theadgt;  lt;trgt;  lt;thgt;IDlt;/thgt;  lt;thgt;Formlt;/thgt;  lt;thgt;Activelt;/thgt;  lt;/trgt;  lt;/theadgt;  lt;tbodygt;  @foreach (var item in Model.forms)  {  lt;trgt;  lt;tdgt;  @item.Id  lt;/tdgt;  lt;tdgt;  @item.ItemForm  lt;/tdgt;  lt;tdgt;  @item.Active  lt;/tdgt;  lt;/trgt;  }  lt;/tbodygt;      lt;/tablegt; lt;/divgt;  

Я добавил foreach в модель индекса для тестирования, и 3 строки из таблицы записываются в консоль. Проблема в том, что я получаю нулевую ссылку для «Ссылка на объект не установлена на экземпляр объекта»

У меня были аналогичные ошибки в EFCore, когда я неправильно обработал модель, и она была равна нулю, однако, поскольку строки возвращаются в консоль для меня, я не вижу, как модель равна нулю.

Комментарии:

1. Какая линия выбрасывает NRE?

2. @gunr2171 начало каждого в файле cshtml. Значение foreach в модели страницы не выдает NRE.

Ответ №1:

попробуйте добавить модель на страницу просмотра индекса

 @page  @model IndexModel @{ }  

Ответ №2:

Я думаю, это было вызвано полной ошибкой новичка.

Если вы проверите мой метод loadData в моем DBAccess, он вернет задачу. Мой OnGet был установлен на недействительный, но изменил его на

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

исправлена проблема, и cshtml foreach теперь отображает каждую возвращенную строку. Я протестировал один возврат GetCDItemForm(1), и он также отображается правильно. Я должен предположить, что это была моя проблема с пустотой/задачей, которая вызвала это.

Пожалуйста, не стесняйтесь объяснить мне, если это не так просто, как я сказал.