如何向Controller发送/接收参数?

时间:2014-02-11 18:18:59

标签: asp.net-mvc rest asp.net-web-api controller asp.net-web-api-routing

这与this question

的后续行动有关

我需要知道如何传递和接收Web API REST方法的参数。

我相信我从客户传递args的方式是正确的,即:

http://localhost:28642/api/InventoryItems/PostInventoryItem?ID=42?pksize=12?Description=ValuableDesc?vendor_id=venderado?dept=42?subdept=85?UnitCost=2.50?UnitList=3.75?OpenQty=25.25?UPC=12345?upc_pack_size=24?vendor_item=someVendorItem?crv_id=9898987

......第一部分:

http://localhost:28642/

...是机器和端口;第二部分:

/api/InventoryItems/PostInventoryItem

...表示Controller及其运行方法,最后一部分(其余部分)是要传递的各个args(格式为“?= ”)。

基于所写的here,即:

“该方法采用Product类型的参数。在Web API中,具有复杂类型的参数从请求体中反序列化。因此,我们希望客户端以XML格式发送产品对象的序列化表示。或JSON格式。“

......我希望我可以在我的控制器上使用它:

   [Route("api/InventoryItems/PostInventoryItem")]   
   public HttpResponseMessage PostInventoryItem(InventoryItem ii)
    {
        _inventoryItemRepository.PostInventoryItem(ii.ID, ii.pksize, ii.Description, ii.vendor_id, ii.dept,
            ii.subdept, ii.UnitCost, ii.UnitList, ii.OpenQty, ii.UPC, ii.upc_pack_size, ii.vendor_item, ii.crv_id);
        // If/when this works, could do this instead:
        //_inventoryItemRepository.PostInventoryItem(ii);
        var response = Request.CreateResponse<InventoryItem>(HttpStatusCode.Created, ii);
        string uri = Url.Link("DefaultApi", new { id = ii.ID });
        response.Headers.Location = new Uri(uri);
        return response;
    }

...并且客户端批次的args会自动捆绑到InventoryItem对象中;但是,唉,Web API无法这样做(或者我做错了什么/还没有做对,但是当达到方法时,ii为null。

我必须在发送方,接收方或两者上做不同的事情吗?究竟,我需要修改或追加什么?

更新

如果我在Controller中尝试这个:

public HttpResponseMessage PostInventoryItem(string id, int pack_size, string description, string vendor_id, int department, int subdepartment, double unit_cost, double unit_list, double open_qty, string UPC_code, int UPC_pack_size, string vendor_item, long crv_id)
{
    _inventoryItemRepository.PostInventoryItem(id, pack_size, description, vendor_id, department, subdepartment,
        unit_cost, unit_list, open_qty, UPC_code, UPC_pack_size, vendor_item, crv_id);
    InventoryItem ii = new InventoryItem();
    ii.ID = id;
    ii.pksize = pack_size;
    . . .
    ii.crv_id = (int)crv_id;
    var response = Request.CreateResponse<InventoryItem>(HttpStatusCode.Created, ii);

...在“_inventoryItemRepository.PostInventoryItem()”行中有一个断点,它没有到达它,并且客户端在尝试将URI发送到服务器时弹出一个消息框,简单地说, “空”。

更新2

将Controller签名更改为:

的组合
public HttpResponseMessage PostInventoryItem([FromUri] InventoryItem ii)

(关于Mike Wasson的文章here

......(对负担丰富的野兽(richaux)的称赞)取代除了第一个以外的所有“?”与“&amp;”:

http://localhost:28642/api/InventoryItems/PostInventoryItem?ID=42&pksize=12&Description=ValuableDesc&vendor_id=venderado&dept=42&subdept=85&UnitCost=2.50&UnitList=3.75&OpenQty=25.25&UPC=12345&upc_pack_size=24&vendor_item=someVendorItem&crv_id=9898987

......做了伎俩。

1 个答案:

答案 0 :(得分:2)

根据原始问题,您有两个问题。首先,正如Richaux所解释的那样,URL的格式不正确。其次,你可以在Uri上拥有复杂类型的内容,但这通常是不好的做法。当您设置的Url名称中包含“Post”时尤其如此。用户期望传递给控制器​​的实体位于请求体中而不是URL。