0

次のクラスがあると考えてくださいViewModels

public class Address
{
    public String Street { get; set; }
}

public class Person()
{
    public Address Address { get; set; }
}

モデルがPersonであるビューがある場合、これを実行できます。

@Html.EditorFor(model => model.Address.Street)

結果の入力名は にAddress.Streetなり、それをアクションにポストすると、デフォルトのモデル バインダーは、 name である入力がAddress.Street実際には propertyStreet内のプロパティを参照していることを認識することができますAddress

それはうまくいきます。

ただし、これを使用しようとすると問題が発生します。

this.Url.Action("MyAction", myPerson)

Url シリアライザーは次のように queryString を作成することを期待しています/person/edit?Address.Street=Xが、実際にはAddressプロパティをシリアル化しません。

このシナリオで Url シリアライザーを機能させるためにできることはありますか?

4

1 に答える 1

1

Url.Actoin は、指定したオブジェクト (この場合は myPerson) から RouteValueDictionary を内部的に作成するため、デフォルトの解決策はないと思います。RouteValueDictionary は、次のメソッドを使用してキーと値のペアを埋めます。

  private void AddValues(object values) { 
        if (values != null) { 
            PropertyDescriptorCollection props = TypeDescriptor.GetProperties(values);
            foreach (PropertyDescriptor prop in props) { 
                object val = prop.GetValue(values);
                Add(prop.Name, val);
            }
        } 
    }

そして、アドレスの結果として次のペアを取得します { "Address", person.Address } そして最後に、値を文字列に変換してクエリ文字列に追加し、クエリ文字列の結果として ?Adress=[person.Address.ToString( を取得します)])

それを行う最も簡単な方法は、必要な方法でオブジェクトから RouteValueDictionary を構築するヘルパーを作成することだと思います。

于 2012-09-03T16:25:23.677 に答える