嗯,它可能类似于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。
答案 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发布此数据。