XmlSerializerとJSON.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を使用していないことに注意してください。