2013-06-19 40 views
1

嗯,它可以类似于How to call an arbitrary service for saving changes with breezejs,但我没有得到明确的答案。使用Breeze.js保存数据

我有Knockout.js/Breeze.js/MVC4 and No Entity Framwork

My requirement一个应用程序 - 我需要调用的API保存按钮被点击时,用微风将数据传递给适当的控制器。

我有我的按钮单击事件为: -

//Saving Profile Details 
fnSave_click = function() { 
    //This profileModel will have the updated data which needs to be pushed to backend 
    var jsonData = {}; 
    jsonData.fName = profileModel.fName; 
    jsonData.lname = profileModel.lname; 
    // Previously i used to make an Ajax call and save the data like below commented code:- 
    /* 
     $.ajax({ 
     type: "POST", 
     url: 'api/profile/ChangeProfileDetails', 
     dataType: "json", 
     contentType: 'application/json; charset=utf-8', 
     data: ko.toJSON(jsonData) 
     }).done(function (data) { 
     }).fail(function (request, error) {}); 
    */ 
    //How do I pass my jsonData to Controller?? Is there any parameter option?? 
    return manager.saveChanges() 
     .then(function() { 
      console.log("changes saved"); 
     }) 
     .fail(function() { 
      console.log("changes failed"); 
     }); 
} 
       ....................... 

现在,我没有得到它......当我将定义我的控制器方法名称?我将如何传递这些数据?

我已经创建了我的微风经理如下: -

// Start - Created breeze data service and manager for query on profile controller 
var dataService = new breeze.DataService({ 
    serviceName: "api/Profile", 
    hasServerMetadata: false // don't ask the server for metadata, 

}); 

var manager = new breeze.EntityManager({ 
    dataService: dataService 
}); 

我已经开始用微风一天。所以请让我知道如果我做错了什么。

[更新]

最后,对于ToDo app with Knockout and Breeze.js这是很好的解释here。我是没有得到 - 请问这是怎么SaveChanges(控制器),点击保存时被调用。

function saveChanges() { 
     return manager.saveChanges()//How does this calls SaveChanges method of controller 
      .then(function() { logger.success("changes saved"); }) 
      .fail(saveFailed); 
    } 

如果我需要调用其他API方法,如'api/Test/MyMethod',我需要做什么?

[更新2] @Jay Traband。在您回复之后,我想更新我的问题。

我已经通this link of release note其中规定: -

添加 “命名保存”。默认情况下,EntityManager.saveChanges方法 发送一个保存请求到一个名为“SaveChanges”的端点。通过“命名为 保存”,您可以在另一个Web API控制器上定位不同的服务器端点,例如 任意命名的操作方法。有 是SaveOptions类中的两个新属性。一个资源名称(用于操作方法的 )和一个dataService(用于定位不同的 控制器)。假设你要保存所有待定更改,则 可以写

var so = new SaveOptions({ 
    resourceName: "myCustomSave" 
}); 
// null = 'all-pending-changes'; saveOptions is the 2nd parameter 
myEntityManager.SaveChanges(null, so); 

我试过这样的,

我有我的JS文件代码 -

debugger; 
      var option = new breeze.SaveOptions({ resourceName: 'myCustomSave' }) 
      return manager.saveChanges(null, option) 

和我的控制器作为: -

[HttpPost] 
public SaveResult MyCustomSave(JObject saveBundle) 
{ 
    return null; 
} 

现在 - 在控制台中抛出没有错误,并且它不会调用我的控制器方法 d。

+0

@kadumel - 如果我没有错,那么元数据是实体框架的上下文。我没有,所以我已经将'dataService'定义为'hasServerMetadata:false'。现在'EntityManager'被定义为'var manager = new breeze.EntityManager({dataService:dataService });'。 – Shubh

+0

@kadumel: - 我想这可能没有EF。在查看[无DB-Breeze.js](http://www.breezejs.com/samples/nodb)后,我的灵感来自EF。不知道为什么它不工作在我的情况:(谢谢。 – Shubh

+0

你可以在这里找到解决方案[保存更改使用微风没有实体框架](http://stackoverflow.com/questions/17767789/saving-changes-using-breeze -without-entity-framework/17778159#17778159) – Anna

回答

1

您可以通过在SaveChanges调用的SaveOptions中指定资源名称来更改Breeze用于保存更改的端点。事情是这样的

// Client 
var so = new SaveOptions({ resourceName: "MyCustomSaveEndpoint" }); 
// listOfEntities may be null in which case all added/modified/deleted entities will be sent 
return myEntityManager.saveChanges(listOfEntities, so); 

,然后服务器

[HttpPost] 
public SaveResult MyCustomSaveEndpoint(JObject saveBundle) { 
    ContextProvider.BeforeSaveEntitiesDelegate = MyCustomSaveLogic; 
    return ContextProvider.SaveChanges(saveBundle); 
} 

在微风文档有更多的信息来实现您BeforeSaveEntities方法。

如果您保存Breeze实体,则此方法是您希望使用的方法,因为它可以在保存后处理客户端缓存更新,并提供客户端保存内容的预先确认。如果您只是想将数据发布到Breeze不需要了解客户端的服务器上,那么只需完全绕过Breeze并直接通过ajax发布这些数据即可。

+0

谢谢回复。我已更新我的问题。 我已经尝试过您昨天提出的答案。 我现在已经更新了这个问题。打我的控制器方法'和'在控制台没有错误。没有得到,我错在哪里。 – Shubh