【问题标题】:Kendo & Web API using OData: ODataActionParameters is null使用 OData 的 Kendo 和 Web API:ODataActionParameters 为空
【发布时间】:2014-09-26 13:03:01
【问题描述】:

使用 OData v3,尝试将 Kendo Grid 绑定到 OData 操作。

问题

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>();

以及我的 Kendo Grid 的配置:

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......

我哪里错了?我该如何解决这个问题?

【问题讨论】:

    标签: asp.net-web-api kendo-ui kendo-grid odata


    【解决方案1】:

    看来我只需要按照以下内容添加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"
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 2013-08-04
      • 2016-07-16
      相关资源
      最近更新 更多