2014-09-26 1 views
0

Используя OData v3, пытаясь связать Kendo Grid с действиями OData.Kendo & Web API с использованием OData: ODataActionParameters имеет значение

Проблема

ODataActionParameters всегда нулевой ...

Вот мои действия:

[EnableQuery] 
[HttpPost] 
public virtual IQueryable<ComparitiveLocalizableString> GetComparitiveTable(ODataActionParameters parameters) 
{ 
    string cultureCode = (string)parameters["cultureCode"]; 

    var query = Repository.Table 
      .Where(x => x.CultureCode == null || x.CultureCode == cultureCode) 
      .GroupBy(x => x.TextKey) 
      .Select(grp => new ComparitiveLocalizableString 
      { 
       Key = grp.Key, 
       InvariantValue = grp.FirstOrDefault(x => x.CultureCode == null).TextValue, 
       LocalizedValue = grp.FirstOrDefault(x => x.CultureCode == cultureCode) == null ? "" : grp.FirstOrDefault(x => x.CultureCode == cultureCode).TextValue 
      }); 

    return query; 
} 

[HttpPost] 
public virtual IHttpActionResult PutComparitive(ODataActionParameters parameters) 
{ 
    string cultureCode = (string)parameters["cultureCode"]; 
    string key = (string)parameters["key"]; 
    var entity = (ComparitiveLocalizableString)parameters["entity"]; 

    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    if (!key.Equals(entity.Key)) 
    { 
     return BadRequest(); 
    } 

    var existing = Repository.Table.FirstOrDefault(x => x.CultureCode == cultureCode && x.TextKey == key); 

    if (existing == null) 
    { 
     return NotFound(); 
    } 

    existing.TextValue = entity.LocalizedValue; 

    Repository.Update(existing); 

    return Updated(entity); 
} 

[HttpPost] 
public virtual IHttpActionResult DeleteComparitive(ODataActionParameters parameters) 
{ 
    string cultureCode = (string)parameters["cultureCode"]; 
    string key = (string)parameters["key"]; 

    var entity = Repository.Table.FirstOrDefault(x => x.CultureCode == cultureCode && x.TextKey == key); 
    if (entity == null) 
    { 
     return NotFound(); 
    } 

    Repository.Delete(entity); 

    return StatusCode(HttpStatusCode.NoContent); 
} 

Моя конфигурация OData маршрут:

var getComparitiveTableAction = builder.Entity<LocalizableString>().Collection.Action("GetComparitiveTable"); 
getComparitiveTableAction.Parameter<string>("cultureCode"); 
getComparitiveTableAction.Returns<IQueryable<ComparitiveLocalizableString>>(); 

var putComparitiveAction = builder.Entity<LocalizableString>().Collection.Action("PutComparitive"); 
putComparitiveAction.Parameter<string>("cultureCode"); 
putComparitiveAction.Parameter<string>("key"); 
putComparitiveAction.Parameter<ComparitiveLocalizableString>("entity"); 
putComparitiveAction.Returns<IHttpActionResult>(); 

var deleteComparitiveAction = builder.Entity<LocalizableString>().Collection.Action("DeleteComparitive"); 
deleteComparitiveAction.Parameter<string>("cultureCode"); 
deleteComparitiveAction.Parameter<string>("key"); 
deleteComparitiveAction.Returns<IHttpActionResult>(); 

и конфигурации для моей Кендо Сетка:

var odataBaseUrl = "/odata/cms/LocalizableStrings/"; 

$(document).ready(function() { 
    $("#Grid").kendoGrid({ 
     data: null, 
     dataSource: { 
      type: "odata", 
      transport: { 
       read: { 
        url: odataBaseUrl + "GetComparitiveTable", 
        dataType: "json", 
        type: "POST" 
       }, 
       update: { 
        url: odataBaseUrl + "PutComparitive", 
        dataType: "json", 
        type: "POST" 
       }, 
       destroy: { 
        url: odataBaseUrl + "DeleteComparitive", 
        dataType: "json", 
        type: "POST" 
       }, 
       parameterMap: function (options, operation) { 
        if (operation === "read") { 
         alert(cultureCode); 
         return JSON.stringify({ 
          cultureCode: cultureCode 
         }); 
        } 
        else if (operation === "update") { 
         var model = models[0]; 
         return { 
          cultureCode: cultureCode, 
          key: model.Key, 
          entity: model 
         }; 
        } 
        else if (operation === "destroy") { 
         var model = models[0]; 
         return { 
          cultureCode: cultureCode, 
          key: model.Key 
         }; 
        } 
       } 
      }, 
      schema: { 
       data: function (data) { 
        return data.value; 
       }, 
       total: function (data) { 
        return data["odata.count"]; 
       }, 
       model: { 
        fields: { 
         Key: { type: "string", editable: false }, 
         InvariantValue: { type: "string", editable: false }, 
         LocalizedValue: { type: "string" } 
        } 
       } 
      }, 
      batch: true, 
      //etc...... 

Где я буду неправильно? Как я могу это исправить?

ответ

0

Кажется, мне просто нужно добавить, contentType: "application/json" согласно следующим образом:

read: { 
        url: odataBaseUrl + "GetComparitiveTable", 
        dataType: "json", 
        contentType: "application/json", 
        type: "POST" 
       }, 
       update: { 
        url: odataBaseUrl + "PutComparitive", 
        dataType: "json", 
        contentType: "application/json", 
        type: "POST" 
       }, 
       destroy: { 
        url: odataBaseUrl + "DeleteComparitive", 
        dataType: "json", 
        contentType: "application/json", 
        type: "POST" 
       } 
Смежные вопросы