Ice*_*ind 2 c# asp.net-mvc json.net kendo-ui kendo-scheduler
我在应用程序中使用 Kendo Scheduler 使用 Web Api 从数据库中提取数据。我创建了一个 Web Api 函数,并在其中硬编码了一些数据,以确保 Kendo Scheduler 可以读取我的数据。这是我的 Api 函数的代码:
[Route("api/v1/Events/GetPersonalEvents", Name = "ApiEventsGetPersonalEvents")]
[HttpGet]
public DataSourceResult GetPersonalEvents([System.Web.Http.ModelBinding.ModelBinder(typeof(WebApiDataSourceRequestModelBinder))]DataSourceRequest request)
{
var q = new ViewModels.Events.EventViewModel();
q.Id = 1;
q.Title = "This is a test";
q.Start = DateTime.Now;
q.End = DateTime.Now.AddHours(1);
q.Description = "Test entry";
var list = new List<ViewModels.Events.EventViewModel>();
list.Add(q);
return list.ToDataSourceResult(request);
}
Run Code Online (Sandbox Code Playgroud)
Kendo Scheduler 没有在日历上显示任何内容。使用 Fiddler,我可以看到 Kendo Scheduler 正在调用我的 API,并且我的 API 正在返回数据。这是发送的 JSON:
{
"data":[
{
"id":1,
"title":"This is a test",
"description":"Test entry",
"isAllDay":false,
"start":"2016-11-18T15:31:33.1173519-08:00",
"end":"2016-11-18T16:31:33.1178524-08:00",
"startTimezone":null,
"endTimezone":null,
"recurrenceRule":null,
"recurrenceException":null
}
],
"total":1,
"aggregateResults":null,
"errors":null
}
Run Code Online (Sandbox Code Playgroud)
一切似乎都运转良好。经过进一步调查,我终于弄清楚了我的问题。在我的global.asax.cs文件中我有这些行:
HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;
Run Code Online (Sandbox Code Playgroud)
它的作用是导致 JSON.Net 自动将 C# 名称转换为 Javascript 友好的名称(例如,Title变为、变为等),这正是我想要的。然而,Kendo 显然要求名称类似于 C#(例如,而不是)。我通过注释掉文件中的这三行来验证这一点,一切正常。titleDescriptiondescriptionTitletitleglobal.asax.cs
所以,然后我将注意力转向我的 ViewModel。我用JsonProperty属性来装饰我的属性,指定一个特定的名称。但是,它仍然被序列化为小写名称。这是视图模型代码:
public class EventViewModel : ISchedulerEvent
{
[JsonProperty(PropertyName = "Id")]
public int Id { get; set; }
[JsonProperty(PropertyName = "Title")]
public string Title { get; set; }
[JsonProperty(PropertyName = "Description")]
public string Description { get; set; }
[JsonProperty(PropertyName = "IsAllDay")]
public bool IsAllDay { get; set; }
[JsonProperty(PropertyName = "Start")]
public DateTime Start { get; set; }
[JsonProperty(PropertyName = "End")]
public DateTime End { get; set; }
[JsonProperty(PropertyName = "StartTimezone")]
public string StartTimezone { get; set; }
[JsonProperty(PropertyName = "EndTimezone")]
public string EndTimezone { get; set; }
[JsonProperty(PropertyName = "RecurrenceRule")]
public string RecurrenceRule { get; set; }
[JsonProperty(PropertyName = "RecurrenceException")]
public string RecurrenceException { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以现在我没有主意了。那么有没有一种方法可以让 Json.Net 正确序列化我的名字,只是为了这个方法,或者我可以在视图模型中使用其他一些属性来使名称正确序列化,或者 Kendo 中是否有一个设置是否允许 Kendo 使用驼峰格式?
如果您使用的是 Json.NET 9.0.1 或更高版本,您可以通过标记特定类型来指定命名策略[JsonObject(NamingStrategyType = typeof(TNamingStrategy))]。这会覆盖 的命名策略CamelCasePropertyNamesContractResolver。在你的情况下你想要DefaultNamingStrategy:
[JsonObject(NamingStrategyType = typeof(DefaultNamingStrategy))]
public class EventViewModel
{
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public bool IsAllDay { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public string StartTimezone { get; set; }
public string EndTimezone { get; set; }
public string RecurrenceRule { get; set; }
public string RecurrenceException { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
请注意,[JsonProperty("name")]不再需要这些属性。
在您的全局合约解析器上,还有一个属性NamingStrategy. 设置NamingStrategy.OverrideSpecifiedNames为false还可以防止[JsonProperty("name")]名称被全局覆盖。因为CamelCasePropertyNamesContractResolver默认值似乎是true,这就是您的问题的原因。
| 归档时间: |
|
| 查看次数: |
643 次 |
| 最近记录: |