【问题标题】:Properly Initialize Client Side Model正确初始化客户端模型
【发布时间】: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


【解决方案1】:

由于您没有共享代码,我只能做一个假设。但是,我认为您对错误消息感到困惑。 Kendo 或 Angular 均不负责。他们不“初始化”类。你自己说过,数据在客户端。

在我看来,数据到达您的控制器操作,编译器不知道如何初始化您的类。确保您的 B 类具有在您的服务器端代码中定义的构造函数。即使是一个空的构造函数也足够了,除非类的成员自己需要显式初始化。

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

【讨论】:

  • 我尝试了您的建议,但无济于事。我犯了同样的错误。我确实希望能够将 FREQUENCY 传递给具有 null nav 属性的控制器并将它们设置在控制器内。
  • 您是否在调试期间或在浏览器的开发工具中检查了请求负载以查看数据是否正在传递到您的服务器?
  • 有效载荷是“{models: [{Id: 0, Frequency: "5746"}]}”,因此它没有其他导航属性的数据。因此,为什么我假设我需要将它们设置为模型不需要并将它们添加到控制器中,或者使用微风并初始化本地模型并设置它们。
  • 啊,我明白了。是的,您要么需要在发布之前在客户端上生成空模型,要么更改导航属性以使其不再需要。我会投票支持后者,并手动将依赖模型添加到控制器操作中的频率类中。简而言之,这个问题与您的实体框架模型配置有关。
猜你喜欢
  • 2012-08-30
  • 2019-05-05
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2013-05-11
  • 2012-12-19
  • 1970-01-01
相关资源
最近更新 更多