1

MVC3 でのモデル バインディングを理解しようとしています。この例を見てください。

コントローラーのコードは次のとおりです。

public ActionResult Index()
    {
        Person person = new Person{ Name = "Test" };

        return View(person);
    }

    [HttpPost]
    public string Edit(Person personModel)
    {
        return string.Format("From server: {0}", personModel.Name);
    }

そして、ここに html/javascript ビットがあります:

@model MCV3.Test.Models.Person
<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript">
    $(document).ready(function (){

        var model = @Html.Raw(Json.Encode(Model));

        $.ajax({
            url : "/Person/Edit", 
            type: "Post",
            datatype: "json",
            data :  model, 
            success: function (data) {                   
                $("#result").text(data);                    
            }
        });

    });
</script>
</head>
<body>
    <label id="result"></label>
</body>
</html>

上記のコードは機能しますが、ajax 呼び出しのデータ設定をこれに変更すると、次のようになります。

$.ajax({
            url : "/Person/Edit", 
            type: "Post",
            datatype: "json",
             data : {personModel : model},
            success: function (data) {                   
                $("#result").text(data);                    
            }
        });

モデルは正しいタイプですが、name プロパティは null です。

動作する例では、投稿パラメーターは次のとおりです。

Name    Test

Name=Test

しかし、うまくいかない例では、それらは次のとおりです。

personModel[Name]   Test

personModel%5BName%5D=Test

次のような場合、MVC は要求をシリアル化できないようです。personModel[Name] Test

カスタムバインダーを書かずにこれを解決する方法はありますか?

4

1 に答える 1

1

MVC バインディングはPerson、アクションに渡すオブジェクトを作成Editして設定しようとするときに、オブジェクトの設定可能なすべてのプロパティの値を見つけようとしPersonます。この場合、Nameプロパティ。したがって、フォーム データ、クエリ文字列データ (など) で、キー 'Name' を持つ名前と値のペアを検索します。動作する例には 1 つあり、動作しない例にはありません。

この形式でデータを投稿したい場合ValueProviderは、データを解析し、見つかったものに基づいて値を返すカスタムを作成できます。

于 2012-09-11T08:37:35.280 に答える