使用Breeze.js保存数据

时间:2013-06-19 05:15:09

标签: breeze

嗯,它可能类似于How to call an arbitrary service for saving changes with breezejs,但我没有得到明确的答案。

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

的应用程序

My requirement - 我需要在点击保存按钮时调用API,并使用Breeze将数据传递给适当的控制器。

我的按钮点击事件为: -

 //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");
        });
}
               .......................

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

我创建了我的Breeze管理器,如下所示: -

// 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
});

我早在Breeze开始了。如果我做错了,请告诉我。

[更新]

最后,对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控制器上任意命名的action方法。那里   是SaveOptions类的两个新属性。一个resourceName(for   动作方法)和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;
}

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

1 个答案:

答案 0 :(得分: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);
}

Breeze文档提供了有关实施BeforeSaveEntities方法的更多信息。

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