0

Моя проблема очень проста. Я использую ASP Web API, Entity Framework, Angular и Kendo UI. У меня есть 2 класса, FREQUENCY и FREQ_TYPE_. Класс FREQUENCY имеет свойство навигации для класса FREQ_TYPE. У меня есть сетка kendo ui, которая загружает 10 моделей FREQUENCY класса. У каждой модели FREQUENCY есть данные FREQ_TYPE, загруженные должным образом. Моя проблема заключается в том, что когда я создаю новую строку в моей сетке kendo ui и пытаюсь сохранить строку на сервере, я получаю сообщение об ошибке, указывающее, что свойство FREQ_TYPE для навигации необходимо инициализировать. Это, конечно, ожидается, так как kendo не знает, как авто = инициализировать мои свойства nav.Правильно инициализировать клиентскую сторону Модель

Какова наилучшая практика предоставления моему угловому JS-клиенту знаний, необходимых для создания нового класса FREQ_TYPE, чтобы я мог правильно инициализировать класс FREQUENCY и сохранить его на сервере? Мои модели существуют только как модели сущности кода, поэтому я не могу просто создать новую модель на стороне клиента JS, поскольку она не знает об этих моделях. Есть ли какая-то инфраструктура, которая может генерировать локальные классы моделей из базы данных EF? Или мне просто нужно вручную установить все json-поля для свойства навигации класса FREQ_TYPE? Или мне проще использовать Web API, чтобы я мог запросить «выяснить», что такое информация о модели, и создать модель JS на стороне клиента без необходимости иметь «локальную модель»?

Вот сетка на стороне клиента и источник данных:

$(document).ready(function() { 

     var crudServiceBaseUrl = "http://localhost:29858/"; 

     var NIICDDS = new kendo.data.DataSource({ 
      transport: { 
       read: { 
        url: crudServiceBaseUrl + "api/NIICDFreq", 
        dataType: "json" 
       }, 
       update: { 

        url: function (data) { 
         console.log("DATA TEST"); 
         console.log(data); 
         return crudServiceBaseUrl + "api/NIICDFreq/"; 
        }, 

        // url: crudServiceBaseUrl + "api/VHFMasterLists", 

        dataType: "json", 
        data: function (data) { 
         console.log("returning data in update TEST"); 
         console.log(data.models[0]); 
         return data.models[0]; 
        }, 
        type: "PUT", 
        contentType: "application/json; charset=utf-8", 

       }, 
       destroy: { 
        url: crudServiceBaseUrl + "api/NIICDFreq", 
        dataType: "json" 
       }, 
       create: { 
        url: crudServiceBaseUrl + "api/NIICDFreq", 
        dataType: "json", 
        type: "POST", 
        contentType: "application/json; charset=utf-8" 
       }, 


       parameterMap: function (model, operation) { 
        if (operation !== "read" && model) { 
         return kendo.stringify(model); 
        } else { 
         return kendo.stringify(model) ; 
        } 
       } 
      }, 
      batch: true, 
      pageSize: 20, 
      schema: { 
       data: function (data) { //specify the array that contains the data 
        console.log("DATA RETURN TEST"); 
        console.log(data); 
        return data || []; 
       }, 
       model: { 
        id: "Id", 
        fields: { 
         Id: { editable: false, 
          nullable: false, 
          type: "number" 
         }, 
         Frequency: { type: "string" } 
        } 
       } 
      } 
     }); 


     $("#NIICDFreqGrid").kendoGrid({ 
      dataSource: NIICDDS, 

      columns: [ 
        { field: "Id", title: "Freq ID", format: "{0:c}", width: "120px" }, 
       { field: "Frequency", title: "Frequency Test", format: "{0:c}", width: "120px" }, 
       { command: ["edit", "destroy"], title: " ", width: "250px" } 
      ], 
      toolbar: ["create"], 
      editable: "inline" 

     }); 






    }); 

А вот контроллер Web API:

 [ResponseType(typeof(FREQUENCY))] 
    public IHttpActionResult PostFREQUENCY(FREQUENCY testfreq) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     db.FREQUENCIES.Add(testfreq); 

     try 
     { 
      db.SaveChanges(); 
     } 
     catch (DbUpdateException) 
     { 
      if (FREQUENCYExists(testfreq.Id)) 
      { 
       return Conflict(); 
      } 
      else 
      { 
       throw; 
      } 
     } 

     return CreatedAtRoute("DefaultApi", new { id = testfreq.Id }, testfreq); 
    } 

Ошибка последняя строка:

iisexpress.exe Information: 0 : Request, Method=POST, Url=http://localhost:29858/api/NIICDFreq, Message='http://localhost:29858/api/NIICDFreq' 
iisexpress.exe Information: 0 : Message='NIICDFreq', Operation=DefaultHttpControllerSelector.SelectController 
iisexpress.exe Information: 0 : Message='CFETSWebAPI.Controllers.Frequency.NIICDFreqController', Operation=DefaultHttpControllerActivator.Create 
iisexpress.exe Information: 0 : Message='CFETSWebAPI.Controllers.Frequency.NIICDFreqController', Operation=HttpControllerDescriptor.CreateController 
iisexpress.exe Information: 0 : Message='Selected action 'PostFREQUENCY(FREQUENCY testfreq)'', Operation=ApiControllerActionSelector.SelectAction 
iisexpress.exe Information: 0 : Message='Value read='DomainModelModule.FREQUENCY'', Operation=JsonMediaTypeFormatter.ReadFromStreamAsync 
iisexpress.exe Information: 0 : Message='Parameter 'testfreq' bound to the value 'DomainModelModule.FREQUENCY'', Operation=FormatterParameterBinding.ExecuteBindingAsync 
iisexpress.exe Information: 0 : Message='Model state is invalid. 
testfreq.FREQ_POOL: The FREQ_POOL field is required.,testfreq.FREQ_TYPE: The FREQ_TYPE field is required.', Operation=HttpActionBinding.ExecuteBindingAsync 

И Конечно, testfreq имеет все нулевые значения.

Благодарим за помощь.

+0

«Есть ли какая-то инфраструктура, которая может генерировать локальные классы моделей из базы данных EF?» Breeze.js. –

+0

Удивительный! Благодарю. Я новичок в веб-дизайне. Есть ли способ генерировать локальные модели JS через веб-api или что-то еще? Таким образом, я мог бы сделать что-то вроде «var test = GenerateBlankMyClassObjectFromServerAPI()». Или, может быть, лучше использовать ветер? Благодарю. –

ответ

0

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

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

public class B { 
    // constructor 
    public B() { 
    // initialize class members 
    } 
} 
+0

Я попробовал ваше предложение безрезультатно. Я получаю ту же ошибку. Я хочу иметь возможность передавать FREQUENCY моему контроллеру с нулевыми свойствами навигатора и устанавливать их внутри контроллера. –

+0

Вы проверили полезную нагрузку запроса во время отладки или в инструментах разработчика вашего браузера, чтобы увидеть, что данные передаются на ваш сервер? – Brett

+0

Полезная нагрузка «{models: [{Id: 0, Frequency:" 5746 "}]}", поэтому у нее нет данных для других свойств навигации. Поэтому я предположил, что мне нужно либо установить их как не требуемые для модели, либо добавить их в контроллер, либо использовать ветерок и инициализировать локальные модели и установить их. –

Смежные вопросы