8

既存のWebApiアクションがあり、HttpPostからHttpGetに切り替えたいと思います。現在、パラメータとして単一の複雑なオブジェクトを取ります。

モデル:

public class BarRequest
{
    [JsonProperty("catid")]
    public int CategoryId { get; set; }
}

コントローラー:

public class FooController : ApiController
{
    //[HttpPost]
    [HttpGet]
    [ActionName("bar")]
    public void Bar([FromUri] BarRequest request)
    {
        if (request != null)
        {
            // CategoryId should be 123, not 0
            Debug.WriteLine("Category ID :: {0}", request.CategoryId);
        }
    }
}

次のリクエストを送信すると、すべてが期待どおりに機能します。

GET /foo/bar?CategoryId=123

また、古いPOSTリクエストは期待どおりに機能しました。

POST /foo/bar {"catid":123}

しかし今、私は次のリクエストが機能する必要があります:

GET /foo/bar?catid=123

どうすればこれを達成できますか?

4

3 に答える 3

12

提案をありがとう、しかし私のために働く唯一の解決策は以下です。

前:

var data = {
    catid: 123,
    // <snip>
};
var json = JSON.stringify(data);
$.post('/foo/bar', json, callback);
public class FooController : ApiController
{
    [HttpPost, ActionName("bar")]
    public void Bar(BarRequest request)
    {
        // use request.Category to process request
    }
}

後:

var data = {
    catid: 123,
    // <snip>
};
var json = JSON.stringify(data);
$.get('/foo/bar?data=' + encodeURIComponent(json), callback);
public class FooController : ApiController
{
    [HttpGet, ActionName("bar")]
    public void Bar(string data)
    {
        var request = JsonConvert.DeserializeObject<BarRequest>(data);
        // use request.Category to process request
    }
}

このようにして、クライアントやサーバー上のモデルやバリデーターなどに触れる必要はありません。さらに、他のすべてのソリューションでは、サーバー側またはクライアント側のいずれかで命名規則を変更する必要がありました。

于 2013-03-26T13:31:53.910 に答える
2

datacontractsとdatamember属性を使用してこれを行うことができます。

http://msdn.microsoft.com/en-us/library/ms733127.aspx

[DataContract]
public class BarRequest{  

   [DataMember(Name="catid")]  
    public int CategoryId { get; set; }
}

Postメソッドの場合

しかし、getメソッドを使用すると、これは複雑なオブジェクトの構造の例です。

api/Bar?request.CategoryId =1&request.AnotherProp=foo
于 2013-03-25T22:44:46.213 に答える
0

に拡張メソッドがありURISystem.Net.Http.UriExtensionsそれはあなたが望むことを正確に実行します:TryReadQueryAs<T>(out T model)。ApiControllerのリクエストからURIを取得できますRequest.RequestUri。外観は次のとおりです。

public class FooController : ApiController
{
    //[HttpPost]
    [HttpGet]
    [ActionName("bar")]
    public void Bar()
    {
        BarRequest request;
        if (Request.RequestUri.TryReadQueryAs(out model))
        {
            // CategoryId should be 123, not 0
            Debug.WriteLine("Category ID :: {0}", request.CategoryId);
        }
    }
}

[DataContract]これは、 Joanが提案したようなものを指定した場合にのみ機能する可能性があります。

ただし、空のクエリ文字列は解析されるため、データが編集されたかどうかによって何か別のことを行っていた場合POSTは、モデルの有効性を確認する必要があることに注意してください。とにかくそれをやっていたといいのですが。

于 2016-07-28T16:53:42.033 に答える