возвращение нулевого значения из заполненного списка выбора с данными БД - PullRequest
0 голосов
/ 19 февраля 2020

Я реализую asp. net core MVC проект. В моем классе контроллера под названием ApiApplicant, метод Create, у меня есть 3 списка выбора, которые должны заполняться его элементами из таблицы APIApplicantHistory. Мои модели, метод создания и представление реализованы следующим образом:

    using System.Collections.Generic;

      namespace CSDDashboard.Models
     {
      public partial class Apiapplicant
      {
        public Apiapplicant()
        {
            ApiApplicantHistory = new HashSet<ApiApplicantHistory>();
        }

        public int Id { get; set; }
        public string ApiRequestDate { get; set; }
        public int? ApiRequestNo { get; set; }
        public int? Apiid { get; set; }
        public int? ApplicantId { get; set; }
        public int? GateId { get; set; }
        public string NocRequestDate { get; set; }
        public string NocRequestNo { get; set; }
        public string Url { get; set; }
        public string Description { get; set; }
        public bool? IsDeleted { get; set; }

        public virtual Api Api { get; set; }
        public virtual Applicant Applicant { get; set; }
        public virtual Gate Gate { get; set; }
        public virtual ICollection<ApiApplicantHistory> ApiApplicantHistory { get; set; }
    }
}

     using System;
     using System.Collections.Generic;

     namespace CSDDashboard.Models
     {
     public partial class ApiApplicantHistory
     {
        public int Id { get; set; }
        public int? ApiApplicantId { get; set; }
        public string Date { get; set; }
        public int? SentResponseType { get; set; }
        public int? UnconfirmedReason { get; set; }
        public int LastReqStatus { get; set; }
        public string Description { get; set; }

           public virtual Apiapplicant ApiApplicant { get; set; }
           public virtual EntityType LastReqStatusNavigation { get; set; }
           public virtual EntityType SentResponseTypeNavigation { get; set; }
           public virtual EntityType UnconfirmedReasonNavigation { get; set; }
        }
       }


       using System;
       using System.Collections.Generic;

       namespace CSDDashboard.Models
       {
        public partial class EntityType
       {
        public EntityType()
        {
            ApiApplicantHistoryLastReqStatusNavigation = new HashSet<ApiApplicantHistory>();
            ApiApplicantHistorySentResponseTypeNavigation = new HashSet<ApiApplicantHistory>();
            ApiApplicantHistoryUnconfirmedReasonNavigation = new HashSet<ApiApplicantHistory>();
        }

        public int Id { get; set; }
        public string Name { get; set; }
        public string EntityKey { get; set; }

        public virtual ICollection<ApiApplicantHistory> ApiApplicantHistoryLastReqStatusNavigation { get; set; }
        public virtual ICollection<ApiApplicantHistory> ApiApplicantHistorySentResponseTypeNavigation { get; set; }
        public virtual ICollection<ApiApplicantHistory> ApiApplicantHistoryUnconfirmedReasonNavigation { get; set; }

    }
}


      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Threading.Tasks;

      namespace CSDDashboard.Models
      {
      public class APIApplicantViewModel
      {
            public Apiapplicant apiApplicantvm { get; set; }

             public ApiApplicantHistory apiApplicantHistoryvm { get; set; }
       }
      }


       public class ApiapplicantsController : Controller
       {
        private readonly CSSDDashboardContext _context;

        public ApiapplicantsController(CSSDDashboardContext context)
        {
            _context = context;
        }

       public IActionResult Create()
        {

            ViewData["sentResponseType"] = new SelectList(_context.EntityType.Where(g => g.EntityKey == "sentResponseType").ToList(), "ID", "name");
            ViewData["unconfirmedReason"] = new SelectList(_context.EntityType.Where(g => g.EntityKey == "unconfirmedReason").ToList(), "ID", "name");
            ViewData["lastReqStatus"] = new SelectList(_context.EntityType.Where(g => g.EntityKey == "lastRequestStatus").ToList(), "ID", "name");

            return View();

        }
       }

И часть реализации создания представления:

     @model CSDDashboard.Models.APIApplicantViewModel

       @{
       ViewData["Title"] = "create";
       }
        <div class="row">
         <div class="col-md-4">
          <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
          <div class="form-group">
                <label asp-for="apiApplicantvm.GateId" class="control-label"></label>
                <select asp-for="apiApplicantvm.GateId" class="form-control" asp-items="ViewBag.GateId"></select>
            </div>
        <div class="form-group">
    <label asp-for="apiApplicantHistoryvm.SentResponseType" class="control-label"></label>
        <select asp-for="apiApplicantHistoryvm.SentResponseType" class="form-control" asp-items="ViewBag.sentResponseType"></select>
        </div>
       <div class="form-group">
        <label asp-for="apiApplicantHistoryvm.UnconfirmedReason" class="control-label"></label>
        <select asp-for="apiApplicantHistoryvm.UnconfirmedReason" class="form-control" asp-items="ViewBag.unconfirmedReason"></select>

       </div>
        <div class="form-group">
            <label asp-for="apiApplicantHistoryvm.LastReqStatus" class="control-label"></label>
            <select asp-for="apiApplicantHistoryvm.LastReqStatus" class="form-control" asp-items="ViewBag.lastReqStatus"></select>
        </div>
<div class="form-group">
                    <input type="submit" value="Create" class="btn btn-primary" />
                </div>
        </form>
       </div>
      </div>

       <div>
       <a asp-action="Index">Back</a>
       </div>

     @section Scripts {
      @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    }

В методе создания все viewData заполнены правильными связанных данных, но проблема существует в представлении «Создать», после запуска проекта на странице «Создание» появляется ошибка, подобная приведенной ниже:

При обработке запроса возникло необработанное исключение. NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

После отладки кода я понимаю, что в представлении создания apiApplicantvm не является нулевым, а apiApplicantHistoryvm возвращает нулевое значение, и из-за этого возникает вышеуказанная ошибка. Я ценю, если кто-нибудь может сказать мне, как решить проблему.

Ответы [ 3 ]

0 голосов
/ 22 февраля 2020

Большое спасибо за ответы. Я использую ядро ​​EF, и я изменил свой код, как вы предложили. Я добавил ViewData ["sentResponseType"] = новый SelectList (_context.EntityType.Where (g => g.EntityKey == "sentResponseType") .Include (x => x.ApiApplicantHistoryLastReqStatusNavigation) .ToList () name ");

в моем методе создания.

И моя проблема здесь в представлении создания, в строке ниже в apiApplicantHistoryvm есть нулевое значение:

0 голосов
/ 22 февраля 2020

Спасибо за помощь. Проблема была здесь, в моем коде 1001 *

Я должен использовать Id вместо ID в соответствии с моей моделью EntityType.

0 голосов
/ 19 февраля 2020

Я надеюсь, что вы будете использовать ядро ​​EF в качестве ORM, потому что вы используете Asp.net core.

Для загрузки связанных данных в EF core.

Это можно сделать двумя способами или Ленивая загрузка

Готовая загрузка

_context.EntityType.Where(g=>g.EntityKey=="sentResponseType") .Include(x=>x.ApiApplicantHistoryLastReqStatusNavigation).ToList()

ИЛИ

Ленивая загрузка на вашем модальном создании

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder .UseLazyLoadingProxies() .UseSqlServer(myConnectionString);

ИЛИ

на startup.cs вашего ядра MVC Пример отложенной загрузки проекта.

.AddDbContext<BloggingContext>( b => b.UseLazyLoadingProxies() .UseSqlServer(myConnectionString));

для получения дополнительной информации docs.microsoft.com/en-us/ef/core/querying/related-data

https://docs.microsoft.com/en-us/ef/core/querying/related-data

...