【发布时间】:2015-02-26 18:55:24
【问题描述】:
我的问题很简单。我正在使用 ASP Web API、实体框架、Angular 和 Kendo UI。我有 2 个类,FREQUENCY 和 FREQ_TYPE_。 FREQUENCY 类具有 FREQ_TYPE 类的导航属性。我有一个加载 10 类 FREQUENCY 模型的剑道 ui 网格。每个类 FREQUENCY 模型都正确加载了其 FREQ_TYPE 数据。我的问题是,当我在剑道 ui 网格中创建一个新行并尝试将该行保存到服务器时,我收到一条错误消息,提示导航属性 FREQ_TYPE 需要初始化。这当然是意料之中的,因为 kendo 不知道如何自动 = 初始化我的导航属性。
为我的 Angular 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 具有所有空值。
感谢您的帮助。
【问题讨论】:
-
"是否有一些框架可以从 EF 数据库生成本地模型类?" Breeze.js.
-
太棒了!谢谢。我显然是网络开发的新手。有没有办法通过 web api 或其他方式生成本地 JS 模型?这样我就可以做类似“var test = GenerateBlankMyClassObjectFromServerAPI()”的事情。或者也许只使用微风会更好?谢谢。
标签: javascript angularjs entity-framework kendo-ui kendo-grid