71

アクションコントローラーで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 オブジェクトを受け取ることだけですか?

4

4 に答える 4

86

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

あなたの要件を解決するために、ここに実用的なソリューションがあります -

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

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] バインディング ソースを自動的に推測することもできます。(ドク)

ここに画像の説明を入力

于 2014-02-05T13:54:22.177 に答える
15

ここにはいくつかの問題があります。まず、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);
        }
   });
于 2014-02-05T13:48:41.023 に答える
4

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

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

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

 public ActionResult AddUser(List<string> model)
 {
 }
于 2014-02-05T13:54:50.550 に答える
3

fwiw、これはajax呼び出しでこれを行うまで機能しませんでした:

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

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

于 2016-12-13T22:53:14.330 に答える