Моя проблема очень проста. Я использую 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 имеет все нулевые значения.
Благодарим за помощь.
«Есть ли какая-то инфраструктура, которая может генерировать локальные классы моделей из базы данных EF?» Breeze.js. –
Удивительный! Благодарю. Я новичок в веб-дизайне. Есть ли способ генерировать локальные модели JS через веб-api или что-то еще? Таким образом, я мог бы сделать что-то вроде «var test = GenerateBlankMyClassObjectFromServerAPI()». Или, может быть, лучше использовать ветер? Благодарю. –