【问题标题】:Web Api DateTime not binding from JSONWeb Api DateTime 未从 JSON 绑定
【发布时间】:2015-02-18 09:10:05
【问题描述】:

这是我的模型

public class PersonVModel
{
    [Required]
    public string FirstName { get; set; }

    [Required]
    [DataType(DataType.DateTime)]
    public DateTime BirthDate { get; set; }
}

这是我的 JSON

{
    "FirstName": "Artur",
    "BrithDate": "4/22/1991"
}

字符串、布尔值和整数可以很好地绑定,但 DateTime 不能

我也尝试过 [DataType(DataType.Date)] 属性,它也不起作用。

有什么解决办法吗?

【问题讨论】:

  • json中的拼写错误是一个简单的问题重写错误还是真的存在?
  • 您可能还必须实现自定义模型绑定器并告诉它如何解析非常本地化的日期格式。
  • 这不是一个有效的 Json 日期。
  • 4/22/1991 不是有效的 json 日期。

标签: c# model-view-controller asp.net-web-api model-binding


【解决方案1】:

您有一个错字:“BrithDate”与“BirthDate”

默认情况下,MVC 模型绑定器仅在绑定失败时将属性设置为默认值。 您可以使用IsValid 属性检查模型的有效性。

我们创建了一个特殊的过滤器,它会在绑定失败的信息中抛出异常。它对 AngularJS 和错误输入有很大帮助。

public class RequireValidModel : ActionFilterAttribute
{
    /// <summary>
    /// Called by the ASP.NET MVC framework before the action method executes.
    /// </summary>
    /// <param name="filterContext">The filter context.</param>
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        ModelStateDictionary state = filterContext.Controller.ViewData.ModelState;

        if (!state.IsValid)
        {
            var perPropertyMessages = state.Where(kvp => kvp.Value.Errors.Count > 0)
                                           .Select(kvp =>
                                               new
                                               {
                                                   Property = kvp.Key,
                                                   Value = kvp.Value.Value != null ? kvp.Value.Value.AttemptedValue: null,
                                                   ErrorMessages = kvp.Value.Errors.Select(err => err.Exception != null ? err.Exception.Message : err.ErrorMessage)
                                               })
                                           .Select(propertyErrors =>
                                               new
                                               {
                                                   propertyErrors.Property,
                                                   propertyErrors.Value,
                                                   ErrorMessages = string.Join("\n", propertyErrors.ErrorMessages)
                                               })
                                           .Select(
                                               propertyErrors =>
                                                   string.Format("(property: {0}, attempted value: {1}, errors: {2}\n)", propertyErrors.Property,
                                                       propertyErrors.Value, propertyErrors.ErrorMessages));

            var finalMessage = string.Format("Invalid model state:\n{0}", string.Join(",\n", perPropertyMessages));

            throw new InvalidOperationException(finalMessage);
        }
    }
}

接下来,为避免日期出现问题,请在接收数据的地方将所有日期字符串转换为 Date 对象。

【讨论】:

    【解决方案2】:

    您的 Json 包含特定于美国的日期字符串,这就是它未被识别为有效日期的原因。此字符串还会导致没有在美国语言环境下运行的任何 C# 代码出现问题。

    虽然 JSON 本身没有指定日期类型,但现在每个人都使用 Javascript 的 ISO8601 格式,例如:"2012-04-21T18:25:43-05:00Z"

    【讨论】:

    • 不一定只有 javascript 的 iso 格式——它是一个与语言无关的标准。 =)
    • 没说是。但人们最终还是采用了 Javascript 的格式,而不是最初尝试使用类似 unix 时间戳的格式
    • 哦!我现在设法解析语法。愚蠢的英语。我的错。
    • 不,只是在努力工作的同时加快打字速度。我不得不自己把这句话读了两遍
    猜你喜欢
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    相关资源
    最近更新 更多