我的问题非常简单。我正在使用ASP Web API,实体框架,Angular和Kendo UI。我有2个类,FREQUENCY和FREQ_TYPE_。类FREQUENCY具有类FREQ_TYPE的导航属性。我有一个kendo ui网格,可以加载10级FREQUENCY模型。每个类FREQUENCY模型都正确加载了它的FREQ_TYPE数据。我的问题是,当我在我的kendo ui网格中创建一个新行并尝试将该行保存到服务器时,我收到一条错误消息,说明需要初始化导航属性FREQ_TYPE。这当然是预期的,因为剑道不知道如何自动=初始化我的导航属性。
为我的角度JS客户端提供创建新类FREQ_TYPE所需的知识的最佳实践是什么,以便我可以正确初始化类FREQUENCY并将其保存到服务器?我的模型只作为代码优先实体模型存在,所以我不能在我的客户端JS中创建一个新模型,因为它不了解这些模型。是否有一些框架可以从EF数据库生成本地模型类?或者我只需要为我的类FREQ_TYPE导航属性手动设置所有json字段?或者是否有一种更简单的方式让我使用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 :(得分:0)
由于您没有共享代码,我只能做出一个假设。但是,我认为您与错误消息混淆了。剑道或Angular都不负责任。他们没有"初始化"类。你说自己,客户端的数据就在那里。
从听起来对我来说,数据到达你的控制器动作,编译器不知道如何初始化你的类。确保您的B类在服务器端代码中定义了构造函数。即使是空构造函数也足够了,除非类的成员需要自己进行显式初始化。
public class B {
// constructor
public B() {
// initialize class members
}
}