【问题标题】:How to send object to controller from Kendo Grid dataSource?如何从 Kendo Grid 数据源将对象发送到控制器?
【发布时间】:2017-04-20 17:04:02
【问题描述】:

我有一个剑道网格,它使用剑道数据源,我不习惯使用剑道数据源进行内联编辑,通常我永远不会进行内联编辑,但我被要求这样做。

我的数据源如下

function PriceLookupGridDataSource() {
    var dataSource = new kendo.data.DataSource({
        transport: {
            read: {
                url: "../KendoGridTesting/GetThePriceLookupGrid",
                dataType: "json"
            },
            update: {
                url: function(item) {
                    console.log(item);
                    return "../KendoGridTesting/PassAnObject?myObj=" + item; 
                }
            }
        },
        schema: {
            model: {
                id: "MaterialTypeID",
                fields: {
                    VendorID: { type: "number" },
                    VendorName: { type: "string" },
                    Description: { type: "string" },
                    MaterialTypeID: { type: "number" },
                    MaterialType: { type: "string" },
                    ServicePrice: { type: "string" },
                    SellUOM: { type: "string" },
                    Cost: { type: "string" },
                    PurchaseUOM: { type: "string" }
                }
            }
        },
        batch: false,
        pageSize: 20
    });

    return dataSource;
}

用于传输更新的控制器方法是

[HttpPost]
public void PassAnObject(PriceLookupGrid myObj)
{
    ...
}

对象是

对象 {VendorID: 26, VendorName: "ACME STONE MASONRY", Description: "Special Stone Quote", MaterialTypeID: 35, MaterialType: "Cladding"…}

PriceLookupGrid 数据类是

public class PriceLookupGrid
    {
        public int VendorID { get; set; }
        public string VendorName { get; set; }
        public string Description { get; set; }
        public int MaterialTypeID { get; set; }
        public string MaterialType { get; set; }
        public string NewPrice { get; set; }
        public string RemodelPrice { get; set; }
        public string ServicePrice { get; set; }
        public string SellUOM { get; set; }
        public string Cost { get; set; }
        public string PurchaseUOM { get; set; }
    }

当我尝试将其传递给我的控制器时,我得到一个错误

GET http://localhost:51193/KendoGridTesting/PassAnObject?id=[object%20Object]&V….0000&ServicePrice=0.0000++++&SellUOM=Each&Cost=0.0000&PurchaseUOM=EachBBB 404(未找到)

它将“项目”作为单独的参数传递,我不希望这种情况发生。

有什么想法吗?

【问题讨论】:

    标签: jquery asp.net-mvc kendo-ui kendo-datasource


    【解决方案1】:

    您的 Action 应该是用 [HttpPost] 装饰的,但您的错误消息表明您正在执行 GET。你需要剑道来POST数据,而不是:

    update: {
        url: "../KendoGridTesting/PassAnObject",
        type: "post" 
    }
    

    【讨论】:

    • 不错,先生。
    • 非常不错的收获。
    • 是的,先生。
    • 哦,但是另一个答案被设置为接受@Chris ...?
    • 是的,如果没有其他答案,我将无法正确传递数据。如果从未发布其他答案,那么我将永远无法正确传递数据
    【解决方案2】:

    这是因为item 是一个对象,正如您在控制台中看到的那样。您不能只将其连接到 url 字符串中。你来解析它。它有一个名为models 的属性,其中包含将发送到服务器的网格的所有更改(或)行。

    为了使 ASP.Net MVC 将您的数据绑定到您的模型中,您必须发送如下日期:

    ../KendoGridTesting/PassAnObject?VendorID=1&VendorName=...
    

    将数据“解析”到 url 的简单方法是:

    var model = {VendorID: 26, VendorName: "ACME STONE MASONRY", Description: "Special Stone Quote", MaterialTypeID: 35, MaterialType: "Cladding"};
    
    function modelToUrlParams(model) {
      var params = [];
      
      Object.keys(model).forEach(key => params.push(key + "=" + model[key]));
      
      return encodeURI("?" + params.join("&"));
    };
    
    var myUrl = "../KendoGridTesting/PassAnObject" + modelToUrlParams(model);
    
    console.log("Final Url", myUrl);

    【讨论】:

    • 我尝试了你的建议,但控制台中不断出现错误,它不会命中我控制器中的方法
    • @Chris 什么错误?它至少会打开请求吗?
    • 它以预期的方式解析它,但错误是 404 GET localhost:51193/KendoGridTesting/…....0000&ServicePrice=0.0000++++&SellUOM=Each&Cost=0.0000&PurchaseUOM=EachBBB 404 (Not Found) >
    • 我已经仔细检查甚至复制并粘贴了方法名称。我有断点,它只是不想点击方法
    • @Chris 我没有关于它的资源,但 mvc 需要知道属性名称和值。它就像任何其他 web api 语言。
    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2018-06-09
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多