MVC 4 하이브리드 SPA (각 기능은 SPA이지만 기능 간 이동은 페이지를 다시로드 함)를 사용하여 Visual Studio 2012에서 만든 Entity Framework 및 낙관적 동시성 업데이트가 Entity Framework를 통과하지는 않지만 낙관적 인 동시성 프레임 워크를 사용하여 원래 값을 저장하거나 비교할 수 있습니다. 그래서 ... MVC4 ApiController와의 낙관적 동시성
Partial Public Class FS_Item
Public Property ItemNumber As String
Public Property ItemDescription As String
Public Property ItemUM As String
' zillions more properties
Private _ItemInventories As ICollection(Of FS_ItemInventory) = New HashSet(Of FS_ItemInventory)
Public Overridable Property ItemInventories As ICollection(Of FS_ItemInventory)
Get
Return _ItemInventories
End Get
Friend Set(value As ICollection(Of FS_ItemInventory))
_ItemInventories = value
End Set
End Property
End Class
내가 이렇게 같은 ApiController 파생 클래스로 구현 편안한 API를 가지고 ...과 같이, 내 개체 모델을 표현하기 위해
Public Class FSItemController
Inherits ApiController
Private data As New FSDB()
' GET api/fsitem
Public Function GetValues() As IEnumerable(Of FS_Item)
Return data.FS_Item.Take(50).ToArray()
End Function
' Etc...
' POST api/fsitem
Public Sub PostValue(ByVal value As IEnumerable(Of FS_Item))
' Not implemented yet
End Sub
End Class
을 포항 강판을 사용하고 SPA를 다음입니다 예제 코드는 일 목록 응용 프로그램, 나는 그리드는 슬릭 기반으로
window.webui = window.webui || {};
window.webui.inventorycontext = (function() {
var datacontext = {
getItems: getItems,
getItem: getItem,
getNextItem: getNextItem,
saveItems: saveItems
};
return datacontext;
function getItems(itemsObservable, errorObservable) {
return ajaxRequest("get", inventoryUrl())
.done(getSucceeded)
.fail(getFailed);
// ...
}
// ...
function saveItems(items, errorObservable) {
return ajaxRequest("post", inventoryUrl(), items)
.done(postSucceeded)
.fail(postFailed);
function postSucceeded(data) {
// Not implemented yet
}
function postFailed() {
errorObservable("Error saving items.");
}
}
function ajaxRequest(type, url, data, dataType) { // Ajax helper
var options = {
dataType: dataType || "json",
contentType: "application/json",
cache: false,
type: type,
data: data ? ko.toJSON(data) : null
};
var antiForgeryToken = $("#antiForgeryToken").val();
if (antiForgeryToken) {
options.headers = {
'RequestVerificationToken': antiForgeryToken
}
}
return $.ajax(url, options);
}
// routes
function inventoryUrl(id) { return "/api/FSItem/" + (id || ""); }
function inventoryNextUrl(id, next) { return "/api/FSItem/" + (id || "") + "?nextItem=" + next; }
})();
내가 지금 같은 그리드 컨트롤에서 일을 고려하고 데이터를 게시 할 수있는 데이터 컨텍스트 클라이언트 측을 가지고 ... 그리드, 그래서 같은 .viewmodel.js
파일의 save
기능에 의해 추출되어 오는 데이터 ... BTW
self.save = function() {
grid.getEditorLock().commitCurrentEdit();
var items = grid.getData().getItems();
datacontext.saveItems(items, error);
};
, 또한 데이터 바인딩에 대한 녹아웃을 사용하고, 나는 jQuery를와의 요소를 포함했다 jquery-ui.
값을 변경하고 값을 변경하고 전체 배열을 서버에 게시하고 디버거에서 업데이트를 보는 데 큰 성공을 거두고 있지만 안전하게 유지하기위한 최적의 방법을 찾지 못했습니다.
마침내 내 질문에. 나는 knockoutjs와 아마도 다른 프레임 워크가 어떤 것인가를 잘 알고있다. _destroy
속성을 삭제 된 객체에 추가하면 서버 코드가 삭제 될 수 있으므로 삭제 된 것으로 처리 할 것이다. 그리고 거기에 낙관적 인 동시성을 사용하여 업데이트 된 개체를 다루는 몇 가지 유사한 규칙이있을 수 있습니다 의심하지만, 거기에있는 경우에도이 정보를 어떻게 서버에 다시 내 서버에 개체 모델을 만들 것이라고 명확하지 않아요. _destroy 또는 다른 객체와 같은 속성을 포함하고 추가하면 아마도 POCO 이상에서 벗어날 것입니다. 맞습니까?
클라이언트가 제출 한 업데이트 된 개체가 마지막 액세스 이후 변경되지 않았 음을 보장하는 올바른 방법은 무엇입니까? 클라이언트가 이미 존재하지 않는다면 원래의 값과 새로운 값을 추적하는 내 자신의 방법을 알아낼 수 있습니다 (어떤 메커니즘이 이미 존재하는지에 대해 알고 싶지만). 하지만 POCO 객체를 오염시키지 않고 그 정보가 ApiController에 전달되는 방법에 난처한 상황입니다. 누구나이 프레임 워크 세트로 낙관적 동시성을 구현 했습니까?