web-dev-qa-db-ja.com

JSONをMVC 5アクションメソッドパラメーターとして受信する方法

アクションコントローラーでJSONオブジェクトを受信しようとして、午後中ずっとWebをクロールしようとしていました。

それを行うための正しいまたは簡単な方法は何ですか?

私は次のことを試しました:1:

    //Post/ Roles/AddUser
    [HttpPost]
    public ActionResult AddUser(String model)
    {
        if(model != null)
        {
            return Json("Success");
        }else
        {
            return Json("An Error Has occoured");
        }

    }

これにより、入力でnull値が返されました。

2:

    //Post/ Roles/AddUser
    [HttpPost]
    public ActionResult AddUser(IDictionary<string, object> model)
    {
        if(model != null)
        {
            return Json("Success");
        }else
        {
            return Json("An Error Has occoured");
        }

    }

それは私にそれを投稿しようとしているjquery側で500エラーを与えますか? (つまり、正しくバインドされなかったことを意味します)。

ここに私のjQueryコードがあります:

<script>
function submitForm() {

    var usersRoles = new Array;
    jQuery("#dualSelectRoles2 option").each(function () {
        usersRoles.Push(jQuery(this).val());
    });
    console.log(usersRoles);

    jQuery.ajax({
        type: "POST",
        url: "@Url.Action("AddUser")",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: JSON.stringify(usersRoles),
        success: function (data) { alert(data); },
        failure: function (errMsg) {
            alert(errMsg);
        }
    });
}

私がやりたいのは、mvcアクションでJSONオブジェクトを受け取ることですか?

65
Zapnologica

残念ながら、辞書にはMVCのモデルバインディングに問題があります。 詳細はこちらをご覧ください 。代わりに、カスタムモデルバインダーを作成して、辞書をコントローラーアクションのパラメーターとして取得します。

要件を解決するための実用的なソリューションを次に示します-

まず、次の方法でViewModelを作成します。 PersonModelはRoleModelsのリストを持つことができます。

public class PersonModel
{
    public List<RoleModel> Roles { get; set; }
    public string Name { get; set; }
}

public class RoleModel
{
    public string RoleName { get; set;}
    public string Description { get; set;}
}

次に、基本的なインデックスビューを提供するインデックスアクションを作成します。

    public ActionResult Index()
    {
        return View();
    }

インデックスビューには、次のJQuery AJAX POST操作があります-

<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script>
    $(function () {
        $('#click1').click(function (e) {

            var jsonObject = {
                "Name" : "Rami",
                "Roles": [{ "RoleName": "Admin", "Description" : "Admin Role"}, { "RoleName": "User", "Description" : "User Role"}]
            };

            $.ajax({
                url: "@Url.Action("AddUser")",
                type: "POST",
                data: JSON.stringify(jsonObject),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                error: function (response) {
                    alert(response.responseText);
            },
                success: function (response) {
                    alert(response);
                }
            });

        });
    });
</script>

<input type="button" value="click1" id="click1" />

AddUserアクションへのインデックスアクションの投稿-

    [HttpPost]
    public ActionResult AddUser(PersonModel model)
    {
        if (model != null)
        {
            return Json("Success");
        }
        else
        {
            return Json("An Error Has occoured");
        }

    }

そのため、投稿が発生したときに、アクションのモデルパラメーターで投稿されたすべてのデータを取得できます。

更新:

Asp.netコアの場合、アクションパラメーターとしてJSONデータを取得するには、コントローラーアクションのパラメーター名の前に[FromBody]属性を追加する必要があります。注:ASP.NET Core 2.1を使用している場合は、[ApiController]属性を使用して、複雑なアクションメソッドパラメーターの[FromBody]バインディングソースを自動的に推測することもできます。 (Doc)

enter image description here

74
ramiramilu

ここにはいくつかの問題があります。まず、JSONオブジェクトをコントローラーのモデルにバインドし直す必要があります。これは変更することにより行われます

data: JSON.stringify(usersRoles),

data: { model: JSON.stringify(usersRoles) },

第二に、jquery呼び出しで型を正しくバインドしていません。削除する場合

contentType: "application/json; charset=utf-8",

本質的に文字列にバインドされます。

すべて一緒に、最初のActionResultメソッドと次のjquery ajax呼び出しを使用します。

    jQuery.ajax({
        type: "POST",
        url: "@Url.Action("AddUser")",
        dataType: "json",
        data: { model: JSON.stringify(usersRoles) },
        success: function (data) { alert(data); },
        failure: function (errMsg) {
        alert(errMsg);
        }
   });
13
Mike Lorenzana

文字列の配列を送信しています

var usersRoles = [];
jQuery("#dualSelectRoles2 option").each(function () {
    usersRoles.Push(jQuery(this).val());
});   

それに応じてモデルタイプを変更します

 public ActionResult AddUser(List<string> model)
 {
 }
4

fwiw、これは私がajax呼び出しでこれを持つまで私にとっては機能しませんでした:

contentType: "application/json; charset=utf-8",

asp.Net MVC 4を使用します。

3
Trober