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; }
}

现在考虑以下 ASP.NET MVC 3 操作,它接受 JSON 或 XML 请求并以各自的格式返回模型(基于接受标头)。

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();
        }
    }
}

JSON 和 XML 输入存在自定义ValueProviderFactory实现。IsReallyImportant目前而言,当输入映射到 MyModel 时将被忽略。但是,如果我定义IsReallyImportant使用“isreallyimportant”的属性,那么信息就会被正确序列化。

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

正如预期的那样,默认绑定器在将传入值映射到模型时使用属性名称。我查看了BindAttribute,但是属性不支持它。

如何告诉 ASP.NET MVC 3 该属性IsReallyImportant应该在传入请求中绑定到“重要”?

我有太多模型无法为每个模型编写自定义活页夹。请注意,我不使用 ASP.NET Web API。

4

1 回答 1

0

您只能执行一个自定义 ModelBinder,它将查找 JSonProperty 和 XMLElement 属性以映射正确的属性。这样您就可以在任何地方使用它,而不必为每个模型开发模型绑定器。不幸的是,除了自定义模型绑定器之外,没有其他选项可以修改属性绑定。

于 2012-06-10T22:59:30.947 回答