Я тестирование OData Action с помощью ODataActionsSample, который загружается из http://aspnet.codeplex.com/sourcecontrol/latest#Samples/WebApi/OData/v4/ODataActionsSample/ODataActionsSample/, как сервер и вызов «Checkout» действие, которое,Возврат данных из OData действий с использованием OData Client
[HttpPost]
public IHttpActionResult CheckOut(int key)
{
var movie = _db.Movies.FirstOrDefault(m => m.ID == key);
if (movie == null)
{
return BadRequest(ModelState);
}
if (!TryCheckoutMovie(movie))
{
return BadRequest("The movie is already checked out.");
}
return Ok(movie);
}
Действие возвращает фильм с обновленным proprety «DueDate» в примере программы, которая зовёт действия с JavaScript, как показано ниже:
// Invoke "checkout" or "return" action. Both actions take no parameter data.
function invokeAction(url) {
ajaxRequest("post", url)
.done(function (updated) {
updateMovie(updated);
})
.fail(function (jqXHR, textStatus, errorThrown) {
//parent.errorMessage(errorThrown);
parent.errorMessage(url);
});
}
self.update(data);
// Update the model with new data from the server.
function updateMovie(data) {
var dueDate = data.DueDate ? new Date(data.DueDate) : null;
self.dueDate(dueDate);
if (data["#ODataActionsSample.Models.CheckOut"]) {
self.checkoutUrl(data["#ODataActionsSample.Models.CheckOut"].target);
}
else {
self.checkoutUrl(null);
}
if (data["#ODataActionsSample.Models.Return"]) {
self.returnMovieUrl(data["#ODataActionsSample.Models.Return"].target);
}
else {
self.returnMovieUrl(null);
}
}
Однако, вызов от клиента OData возвращает фильм без DueDate обновляется. Код клиента выглядит следующим образом:
string serviceUri = "http://localhost:44221/OData/";
var container = new Container(new Uri(serviceUri));
var movieQuery = from movie in container.Movies select movie;
DataServiceCollection<ODataActionsClient.Movie> trackedMovies = new DataServiceCollection<ODataActionsClient.Movie>(movieQuery, TrackingMode.AutoChangeTracking, "Movies",null,null);
var myMovie = trackedMovies[0];
try
{
var checkouttedMovie = myMovie.CheckOut().GetValue();
}
catch (Exception ex)
{
Console.WriteLine(ex.InnerException.ToString());
}
Что не так с моим кодом на стороне клиента?
DueDate имеет значение null в newMovie является правильным, поскольку метод create не является новым DueDate для newMovie, checkouttedMovie's dueDate тоже нулевой? –
DueDate в newMovie должен быть нулевым. Я сделал неправильный комментарий. Однако DueDate в checkouttedMovie не должен быть нулевым, не так ли? – Matthew
Я обнаружил, что он получает DueDate, если я изменяю MergeOption toMergeOption.PreserveChanges или MergeOption.OverwriteChanges. Это нормальное поведение? – Matthew