1

MVC 3 Web サイトに次のスニペットがあります。

モデル:

public class Item1
{
    [Display(Name = "Family name")]
    public string FamilyName { get; set; }

    [Display(Name = "Given name")]
    public string GivenName { get; set; }
}

コントローラーの方法:

public string SaveAsIs(string form_section11)
{
    //  method 1 works
    var viewModel = new JavaScriptSerializer().Deserialize<IDictionary<string, object>>(form_section11);

    //  method 2 gives empty viewModel2
    var viewModel2 = new JavaScriptSerializer().Deserialize<Item1>(form_section11);

    //  method 3 gives empty item1
    Mapper.CreateMap<IDictionary<string, object>, Item1>();
    Item1 item1 = Mapper.Map<IDictionary<string, object>, Item1>(viewModel);

}

そして、私が返信している値は、私のモデルを表す JSON.stringified 構造です。文字列 (読みやすいようにレイアウトされています) は次のように表示されます。

"{
\"item1.FamilyName\":\"Smith\",
\"item1.GivenName\":\"Jane\"
}"

私がやりたいことは、文字列化された JSON を自分のモデルに変換することですが、上記の 2 つの試行を超えて行う方法や、独自のシリアライザーを作成する方法がわかりません:-(

他のすべては正常に動作します。誰でも他のアイデアを思いつきました。ありがとう。

更新 1

Darin のおかげで、上記のようitem1.に使用する前に削除するという部分的な解決策がありJavaScriptSerializerます。奇妙なのは item1 です。強く型付けされたモデルを使用する場合、Razor、MVC 3 などによって追加されます。とにかく、私は今解決策を持っています - ありがとう。

更新 2

以下の Darin の質問への回答として、Item1 は私のモデルの 1 つのエンティティです。モデルは次のようになります。

public class ItemModel
{
    public Item1 item1 {get; set;}
    public Item2 item2 {get; set;}
}

ビューは@model ItemModel、フィールドを as として使用し@Html.EditorFor(m => m.item1.FamilyName)ます。2 つのエンティティは同じ画面上で異なる形式になっており、次のように返しています。

 var form_section1Data = JSON.stringify($("#form_section1").formParams()); //item1
 var form_section1Data = JSON.stringify($("#form_section1").formParams()); //item2

Ajax 呼び出しには以下が含まれます。

data: JSON.stringify({ 
    form_section1: form_section1Data,
    form_section2: form_section2Data
}),

最初の質問を単純化しました(役立つようにしています:-))

4

1 に答える 1

4

.プロパティ名に含めることは一般的ではありません。たとえば、次の JavaScript オブジェクトがあるとします。

var item = { familyName: 'Smith', givenName: 'Jane' };

および次のコントローラ アクション:

[HttpPost]
public ActionResult SaveAsIs(Item1 model)
{
    ...
}

これで、AJAX リクエストを送信するのは非常に簡単になりました。

$.ajax({
    url: '@Url.Action("SaveAsIs")',
    type: 'POST',
    contentType: 'application/json;charset=utf-8',
    data: JSON.stringify(item),
    success: function (result) {

    }
});

これにより、POST リクエスト本文で次のペイロードが送信されます。

{"familyName":"Smith","givenName":"Jane"}

ご覧のとおり、プロパティ名にはドットがありません。JSON 要求を逆シリアル化するために ASP.NET MVC によって使用される既定の JavaScriptSerializer は、モデルに異なるプロパティ名を使用するように簡単に構成できないため、問題があります。ご存知のように、.NET オブジェクトのプロパティ名にドットを含めることはできません。

一方、プロパティ名にドットを含むこの JSON ペイロードが絶対に必要な場合は、名前をオーバーライドできるカスタム属性でビュー モデル プロパティを装飾できるようにするcustom value provider factoryusingを記述できます。JSON.NET

于 2012-10-20T16:26:38.920 に答える