2

XmlSerializerJSON.netを使用して、それぞれの形式との間でオブジェクトをシリアル化する次のモデルについて考えてみます。

[XmlRoot("my_model")]
[JsonObject("my_model")]
public class MyModel {

    [JsonProperty("property1")]
    [XmlElement("property1")]
    public string Property1 { get; set; }

    [JsonProperty("important")]
    [XmlElement("important")]
    public string IsReallyImportant { get; set; }
}

次に、JSONまたはXML要求を受け入れ、それぞれの形式(acceptヘッダーに基づく)でモデルを返す次のASP.NETMVC3アクションについて考えてみます。

public class MyController {
    public ActionResult Post(MyModel model) {

        // process model

        string acceptType = Request.AcceptTypes[0];
        int index = acceptType.IndexOf(';');
        if (index > 0)
        {
            acceptType = item.Substring(0, index);
        }

        switch(acceptType) {
            case "application/xml":
            case "text/xml":
                return new XmlResult(model);

            case "application/json":
                return new JsonNetResult(model);

            default:
                return View();
        }
    }
}

カスタムValueProviderFactory実装は、JSONおよびXML入力用に存在します。現状でIsReallyImportantは、入力がMyModelにマップされているときは無視されます。ただし、IsReallyImportant「isreallyimportant」を使用するための属性を定義すると、情報は正しくシリアル化されます。

[JsonProperty("isreallyimportant")]
[XmlElement("isreallyimportant")]
public string IsReallyImportant { get; set; }

予想どおり、デフォルトのバインダーは、着信値をモデルにマッピングするときにプロパティ名を使用します。BindAttributeを確認しましたが、プロパティではサポートされていません。

ASP.NET MVC 3IsReallyImportantに、着信要求でプロパティを「重要」にバインドする必要があることをどのように伝えますか?

モデルが多すぎて、それぞれにカスタムバインダーを作成できません。ASP.NETWebAPIを使用していないことに注意してください。

4

1 に答える 1

0

適切なプロパティをマップするためにJSonProperty属性とXMLElement属性を検索するカスタムModelBinderを1つだけ実行できます。このようにして、どこでも使用でき、モデルごとにモデルバインダーを開発する必要がありません。残念ながら、カスタムmodelbinders以外にプロパティバインディングを変更するオプションはありません。

于 2012-06-10T22:59:30.947 に答える