2013-11-27 2 views
0

У меня есть гибридный 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. Кто-нибудь реализовал оптимистичный параллелизм с этим набором фреймворков?

ответ

0

Я создал новый класс в моем контроллере:

Public Class PostedFS_ItemData 
    Public Property originals As FS_Item() 
    Public Property updated As FS_Item() 
End Class 

И обновил мой пост метода:

Public Sub PostValue(ByVal value As PostedFS_ItemData) 
    'Not implemented yet 
End Sub 

Теперь я думаю, что я могу отобразить оригиналы строки обновленных строк на основе значений ключа , которые требуются.

Смежные вопросы