正确初始化客户端模型

时间:2015-02-26 18:55:25

标签: javascript angularjs entity-framework kendo-ui kendo-grid

我的问题非常简单。我正在使用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具有所有空值。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

由于您没有共享代码,我只能做出一个假设。但是,我认为您与错误消息混淆了。剑道或Angular都不负责任。他们没有"初始化"类。你说自己,客户端的数据就在那里。

从听起来对我来说,数据到达你的控制器动作,编译器不知道如何初始化你的类。确保您的B类在服务器端代码中定义了构造函数。即使是空构造函数也足够了,除非类的成员需要自己进行显式初始化。

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