Я использую ASP MVC с JQuery и отправляю данные json на мой контроллер.
var jsonPostData = {
control: "PersonControl",
data: {
name: "Craig",
age: 25
}
};
Я использую следующее для выполнения сериализации.
public override void OnActionExecuting(ActionExecutingContext FilterContext)
{
var contentType = FilterContext.HttpContext.Request.ContentType
?? string.Empty;
if (contentType.Contains("application/json"))
{
object JsonObject = new DataContractJsonSerializer(RootType)
.ReadObject(FilterContext.HttpContext.Request.InputStream);
FilterContext.ActionParameters[Param] = JsonObject;
}
}
Который сериализуется в следующую модель:
[DataContract]
public class ControlModel
{
[DataMember(Name = "control", IsRequired = true)]
public string Control { get; set; }
[DataMember(Name = "data"]
public object Data { get; set; }
}
Это работает нормально.
Проблема, которую я пытаюсь решить, состоит в том, что тип данных зависит от того, что передается для контрольного значения.
Я использую отражение, чтобы создать экземпляр элемента управления из значения элемента управления. Я хотел бы иметь возможность затем вызывать этот экземпляр элемента управления, чтобы получить динамический тип и затем использовать его для сериализации «данных» отдельно.
CustomControl.GetDataType()
здесь вернется typeof(PersonModel)
object JsonObject = new DataContractJsonSerializer(CustomControl.GetDataType())
.ReadObject(FilterContext.HttpContext.Request.InputStream);
[DataContract] //this is what data could be serialized too
public class PersonModel
{
[DataMember(Name="name", IsRequired=true)]
public string Name { get; set; }
[DataMember(Name="age", IsRequired=true)]
public string Age { get; set; }
}
По сути, я пытаюсь выяснить, могу ли я проанализировать мой JSON в двух разных частичных фрагментах.
Идеи? Предложения? * * 1023
В соответствии с предложением от thaBadDawg, я в итоге пошел по маршруту JSON.Net , который позволяет мне анализировать элементы JSON по отдельности, что позволяет мне сначала извлечь элемент управления, а затем позже моя реализация управления извлекает необходимые элементы данных.
Вот мой пример выше, переписанный (и упрощенный для примера), чтобы использовать это:
public override void OnActionExecuting(ActionExecutingContext FilterContext)
{
if ((FilterContext.HttpContext.Request.ContentType ?? string.Empty).Contains("application/json"))
{
var bytes = new byte[FilterContext.HttpContext.Request.InputStream.Length];
FilterContext.HttpContext.Request.InputStream.Read(bytes, 0, bytes.Length);
FilterContext.HttpContext.Request.InputStream.Position = 0;
JObject JsonObject = JObject.Parse(Encoding.UTF8.GetString(bytes));
FilterContext.ActionParameters["Control"] = (string) JsonObject["control"];
FilterContext.ActionParameters["Action"] = (string)JsonObject["action"];
}
}