1

好吧,它可能类似于How to call an absolute service for save changes with browsejs,但我没有得到明确的答案。

我有一个应用程序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");
        });
}
               .......................

现在,我不明白......我将在哪里定义我的控制器方法名称?我将如何传递这些数据?

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

// 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对此进行了很好的解释。我没有得到-单击“保存”时如何调用(控制器)这个(控制器)。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。在您回复后,我想更新我的问题。

我已经浏览了这个发布说明的链接,其中指出: -

添加了“命名保存”。默认情况下,EntityManager.saveChanges 方法将保存请求发送到名为“SaveChanges”的端点。使用“命名保存”,您可以针对不同的服务器端点,例如在另一个 Web API 控制器上任意命名的操作方法。SaveOptions 类有两个新属性。一个 resourceName(用于操作方法)和一个 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 方法

4

1 回答 1

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 发布此数据。

于 2013-06-19T17:13:21.550 回答