Как получить доступ к данным, возвращаемым контроллером, вызванным вызовом ajax в представлении MVC - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть представление MVC 5 со следующим JavaScript, который получает ошибку после вызова метода действия на контроллере:

<script type="text/javascript">
    $('#ddlvendors').change(function () {
                var descHtml = "";
                var vendorId = $(this).val(); 

                $.ajax(
                    {
                        type: "POST",
                        data: { vendorId: vendorId },
                        url: '@Url.Action("PurchaseOrderVendor")',
                        datatype: "json",
                        success: function (aVendorObject) {
                            alert(aVendorObject.Name);
                        },
                        error: function (req, status, error) {
                            alert(error);
                        }
                     });
            });
</script>

Метод действия контроллера следующий:

[HttpPost]
public ActionResult PurchaseOrderVendor( int vendorId)
{
  Vendor aVendor=VendorServices.GetVendor(vendorId);

  return Json(aVendor);
}

Возвращаемый объект поставщика выглядит следующим образом:

 public class VendorViewModel
  {
    public int VendorId { get; set; }
    public string Name { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }
    public string Description { get; set; }
    public string ContactName { get; set; }
    public string Phone { get; set; }
  }

С помощью отладчика Visual Studio 2017 я вижу, что данные поставщика правильно заполняются на стороне контроллера. Если я не пытаюсь получить доступ к каким-либо данным о членах, вызов ajax завершается без ошибок. Тем не менее, когда я пытаюсь получить доступ к любой части, поступающей как aVendorObject, такой как aVendorObject.Name, я получаю сообщение об ошибке браузера, говорящее «Внутренняя ошибка сервера». Как я могу исправить свой обработчик успеха в вызове ajax, чтобы я мог получить доступ к членам объекта Vendor, возвращаемым из контроллера?

Заранее спасибо.

1 Ответ

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

В функции LazyLoading EntityFramework 6 не было объекта Vendor, когда он был необходим. Я добавил строку в классе VendorServices, чтобы отключить LazyLoading, что решило проблему. Ниже приведен метод, в котором я отключаю LazyLoading для этого конкретного метода VendorService:

 static public Vendor GetVendor(int aVendorId)
{
  Vendor vendor;
  using (RgmSiteDAL RgmSiteDALCtx = new RgmSiteDAL())
  {
    //** Now setting LazyLoadingEnabled to false.
    RgmSiteDALCtx.Configuration.LazyLoadingEnabled = false;

    vendor = RgmSiteDALCtx.Vendor
                .Where(v => v.VendorId == aVendorId)
               .FirstOrDefault<Vendor>();

  }
    return vendor;
}

Я обнаружил, что могу также решить проблему, если я включу какие-либо свойства навигации, определенные с помощью сущности Vendor, как показано ниже:

vendor = RgmSiteDALCtx.Vendor
                   .Where(v => v.VendorId == aVendorId)
                   .Include(v => v.PurchaseOrder) //because is in Vendor navigation property
                  .FirstOrDefault<Vendor>();

Для моей ситуации я буду придерживаться первого решения, которое устанавливает LazyLoadingEnabled в false. Это связано с тем, что опция для создания моих сущностей из моей существующей базы данных устанавливает мою таблицу PurchaseOrder в качестве свойства навигации для моего Продавца, что, по моему мнению, неверно. Моему объекту Vendor ничего не требуется от моего объекта PurchaseOrder, когда я запрашиваю информацию о Vendor. Я постараюсь удалить свойство навигации PurchaseOrder из моего объекта Vendor, поскольку считаю, что оно было неправильно настроено инструментом создания объектов из базы данных в Visual Studio.

...