Ami*_*inM 7 asp.net asp.net-web-api2
我有一个ASP.NET Web API项目,我正在尝试使用波斯日历存储我的日期.这是我的POCO课程.
public class Person
{
PersianCalendar p = new PersianCalendar();
public Person()
{
}
public Person(string firstName, string lastName, PersianCalendar birthDate)
{
FirstName = firstName;
LastName = lastName;
DateOfBirth = birthDate;
}
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public PersianCalendar DateOfBirth { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我为我的API创建了一个POST方法.
public HttpResponseMessage Post([FromBody] Person _p)
{
try
{
db.Persons.Add(_p);
db.SaveChanges();
var msg = Request.CreateResponse(HttpStatusCode.Created,
_p);
msg.Headers.Location = new Uri(Request.RequestUri + _p.PersonId.ToString());
return msg;
}
catch(Exception ex)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
}
}
Run Code Online (Sandbox Code Playgroud)
但在Chrome开发工具中,我的Person类的断点birthDate设置为null.
任何人都可以帮我解决错误吗?我如何以波斯语格式发送日期?
您模型DateOfBirth中的 POCO 不应属于类型PersianCalendar。日历用于操作DateTime对象,而不是作为对象的容器DateTime。
您的模型应将出生日期存储为正常日期DateTime,然后您可以使用 aPersianCalendar来操作它。执行此操作的简单(但有点难看)的方法是拥有一个DateTime字段和一个单独的公共string属性,用于获取和设置波斯日历格式的日期:
public class Person
{
PersianCalendar p = new PersianCalendar();
public Person()
{
}
public Person(string firstName, string lastName, DateTime birthDate)
{
FirstName = firstName;
LastName = lastName;
DateOfBirth = birthDate;
}
public Person(string firstName, string lastName, string birthDateString)
{
FirstName = firstName;
LastName = lastName;
DateOfBirthString = birthDateString;
}
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth;
public string DateOfBirthString
{
get
{
return string.Format("{0}/{1}/{2}", p.GetYear(DateOfBirth), p.GetMonth(DateOfBirth), p.GetDayOfMonth(DateOfBirth));
}
set
{
var parts = value.Split('/');
DateOfBirth = p.ToDateTime(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), 0, 0, 0, 0);
}
}
}
Run Code Online (Sandbox Code Playgroud)
请记住,aDateTime代表一般的特定时刻。它没有任何唯一正确的字符串表示形式。但是,如果您使用类似于我上面的内容,那么您就可以决定,对于您的应用程序来说,唯一正确的字符串表示形式是波斯日期,格式为yyyy/MM/dd.
编辑:您还可以创建自定义 JSONJsonConverter并在模型中使用它。您的 POCO 模型可能如下所示:
public class Person
{
public Person() { }
public Person(string firstName, string lastName, DateTime birthDate)
{
FirstName = firstName;
LastName = lastName;
DateOfBirth = birthDate;
}
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[JsonConverter(typeof(PersianDateConverter))]
public DateTime DateOfBirth;
}
Run Code Online (Sandbox Code Playgroud)
这个PersianDateConverter类看起来像这样:
public class PersianDateConverter : JsonConverter
{
PersianCalendar pc = new PersianCalendar();
public PersianDateConverter()
{
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
string persianDateString = reader.Value as string;
if (persianDateString == null)
throw new ArgumentException("Error in PersionDateConverter.ReadJson: Got null string");
var parts = persianDateString.Split('/');
return pc.ToDateTime(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), 0, 0, 0, 0);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
DateTime d = (DateTime)value;
string output = string.Format("{0}/{1}/{2}", pc.GetYear(d), pc.GetMonth(d), pc.GetDayOfMonth(d));
writer.WriteValue(output);
}
public override bool CanConvert(Type objectType)
{
if (objectType.Name == "DateTime")
return true;
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
注意:这PersianDateConverter没有针对边缘情况进行充分测试。只要它所操作的数据有效,似乎就可以正常工作。
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |