У меня есть гибридный SPA MVC 4 (каждая функция - SPA, но перемещение между функциями перегружает страницу), созданной с помощью Visual Studio 2012, в которой я намереваюсь полагаться на Entity Framework и оптимистичный параллелизм (хотя обновления не будут проходить через Entity Framework, я могу использовать некоторые из его оптимистичной структуры параллелизма для хранения или сравнения исходных значений). Поэтому я использую Pocos представлять свою объектную модель, как и ...Оптимистичный параллелизм с 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
У меня есть RESTful API реализован с ApiController производных классов, как так ...
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 пример кода для списка приложений Todo, у меня есть на стороне клиента DataContext, которые могут размещать данные, которые я рассматриваю делать из сеточного управления, как так ...
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; }
})();
сетка основана на Слик Grid, и данные, поступающие из вне извлекаются с помощью save
функции в .viewmodel.js
файле как так ...
self.save = function() {
grid.getEditorLock().commitCurrentEdit();
var items = grid.getData().getItems();
datacontext.saveItems(items, error);
};
BTW, я также использую нокаут для связывания данных, и я включил JQuery и элементы JQuery-щ.
У меня большой успех при чтении значений, изменении значений и отправке всего массива на сервер, а также просмотр обновлений в отладчике, но пока еще не разработан оптимальный способ их безопасного хранения.
В заключение на мой вопрос. Я прочитал, что существует соглашение о том, какие нокауты и, возможно, другие фреймворки знают, где добавление свойства _destroy
или что-то в удаленные объекты будут обрабатывать его как удаленное, поэтому код сервера может узнать о его удалении. И я подозреваю, что может быть какое-то подобное соглашение для работы с обновленными объектами с использованием оптимистического параллелизма, но даже если есть, я не понимаю, как эта информация вернет сервер, потому что моя объектная модель на стороне сервера не включают такие свойства, как _destroy или другие объекты, и добавление их, вероятно, отклонилось бы от идеалов POCO, правильно?
Каков правильный способ гарантировать, что обновленные объекты, отправленные клиентом, не изменились с момента последнего обращения. Возможно, я смогу выяснить свой собственный способ отслеживания оригинальных и новых значений на клиенте, если он еще не существует (хотя мне было бы интересно узнать, какие механизмы могут уже существовать). Но я не понимаю, как эта информация будет передана обратно в ApiController, не загрязняя объекты POCO. Кто-нибудь реализовал оптимистичный параллелизм с этим набором фреймворков?