4

私が今持っている最新のwebapiビットで

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);

私のクライアントは、応答から値を読み取る MVC Web サイトです。ようやく応答から HttpError オブジェクトを読み取るようになりましたが、ModelState の読み込みは...控えめに言っても直感的ではありません。

これを書くためのよりクリーンな方法はありますか?

var httpError = response.Read<HttpError>();
 var errors = httpError["ModelState"] as JObject;

 foreach (var error in errors)
 foreach (var message in error.Value.Values<string>())
 {
     modelState.AddModelError(error.Key, message);
 }
4

2 に答える 2

3

あなたが特定したように、エラー応答は簡単に HttpError に逆シリアル化できますが、その中の ModelState 値は最終的に JObject になるだけです。

あなたはおそらくすでに次のようなことを試したことがあるでしょう:

var errors = ((JObject)errorMsg["ModelState"])
             .ToObject<ModelStateDictionary>();

または多分:

var errors = ((JObject)errorMsg["ModelState"])
             .ToObject<Dictionary<string, ICollection<ModelError>>>();

そして、それが変換されないことがわかりました。私が見つけた最良の代替手段は次のとおりです。

var errors = ((JObject)errorMsg["ModelState"])
             .ToObject<Dictionary<string, IList<string>>>();

これにより、反復がわずかにきれいになります。

foreach (var err in errors)
foreach (var msg in err.Value)
{
    modelStateDictionary.AddModelError(err.Key, msg);
}

問題は、私が見ているように、文字列が ModelError インスタンスにデシリアライズされず、ModelErrorCollection によってさらに複雑になり、残念ながら の基本クラス コンストラクターが隠されていることですCollection(IList list)

于 2012-12-14T06:39:59.567 に答える
0

API 呼び出しはどのように行っていますか? クライアント側?もしそうなら、最近のデモでブラッド・ウィルソンが jQuery 経由で AJAX 応答を受信するために以下の形式を使用していることに気付きました。これはあなたが探しているものではないかもしれませんが、私にとってはうまくいっています:

$.ajax({
    url: "/apicontorller/action/",
    contentType: "application/json",
    type: "POST",
    data: jsonData,
    statusCode: {
        200: function (data) {

        },
        404: function () {
            alert('404');
        },
        400: function () {
            alert('invalid');
        },
        500: function () {
            alert('error');
        },
        // ...
    }
});

これの良いところは、実際の HTTP ステータス コードを処理できることです。私の経験では、述語関数にパラメーターを指定することで、エラー メッセージ/データにアクセスできます。私はまだ REST と WebAPI プラットフォームについて学んでいるので、誰かがより良い実装を提供できるなら、私はそれを歓迎します!

于 2012-11-20T18:22:24.890 に答える