2

.net 4.0 Web フォーム Web アプリケーションで Web API を使用して、次のコントローラー アクションがあります。

public dynamic Post(Guid id, string adminNotes = "", string artNotes = "")
        {
            dynamic response = new ExpandoObject();
            response.Success = false;
            Udac udac = CustomerUdacs.Where(x => x.EditKey == id).FirstOrDefault();
            if (udac != null)
            {
                udac.AdminNotes = adminNotes.Trim();
                udac.ArtNotes = artNotes.Trim();
                response.Success = true;
            }
            return response;
        }

jQuery ajax() を使用してデータを投稿しています。ID として Guid を使用しています (JavaScript の ajax_edit_key に格納されています)。これを使用する場合:

$.ajax({
                    type: "POST",
                    url: "/api/notes/"+ajax_edit_key,
                    data: { adminNotes: $("#tbEditNotesAdmin").val(), artNotes: $("#tbEditNotesArt").val() }
                }).done(function (data) {
                    if (data.Success) {
                        $("#tbEditNotesAdmin").val(''); //td.id-notes-admin
                        $("#tbEditNotesArt").val(''); //td.id-notes-art
                        ajax_edit_key = '';
                        $dialog.dialog("close");
                    }
                }).fail(function () {
                    alert('fail');
                });

アクションを呼び出しますが、adminNotes と artNotes はブラウザーから空の文字列として渡されます。

クエリ文字列にパラメーターを含めるように URL を変更すると、正常に動作します。

url: "/api/notes/"+ajax_edit_key+"?"+ "adminNotes="+$('#tbEditNotesAdmin').val()+"&artNotes="+$('#tbEditNotesArt').val()
//data: { adminNotes: $("#tbEditNotesAdmin").val(), artNotes: $("#tbEditNotesArt").val() }

どうしてこれなの?データパラメータを使用するにはどうすればよいですか

4

1 に答える 1

2

ここでの問題は、WebAPI エンジンが複数のパラメーターを解析する方法です。デフォルトではボディリクエストから来る1つのパラメーターのみを解析できますが、2つあります。

解決策は次のとおりです。

2 番目のオプションでは、モデルを作成するだけです。

public class NotesModel
{
    public string AdminNotes { get; set; }
    public string ArtNotes { get; set; }
}

アクションの署名を次のように変更します。

public dynamic Post(Guid id, NotesModel model)

また、JS を変更する必要はありません。

于 2013-01-04T14:18:10.300 に答える