【问题标题】:MVC4 Invalid DateTime valueMVC4 无效的日期时间值
【发布时间】:2013-03-15 12:59:56
【问题描述】:

我尝试了我在互联网上阅读的几乎所有内容,在这个网站上(web.config 中的全球化文化,在我的模型中添加的 DisplayFormat,...)但我没有找到答案。

我的网络应用程序允许用户通过提供一些信息来创建人物。这些信息之一是开始日期,它是一个 DateTime 值。我正在使用 jQuery UI 日期选择器来允许通过日历选择日期。当我选择我的日期(实际上是一天大于 12 的日期)时,应用程序会向我显示一条验证错误消息。比如我选择今天的日期,会出现:The value '03/15/2013' is not valid for StartDate。

我的观点:

    @model BuSIMaterial.Models.Person

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Person</legend>

        <div class="editor-label">
            First name : 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.FirstName, new { maxlength = 50 })
            @Html.ValidationMessageFor(model => model.FirstName)
        </div>

        <div class="editor-label">
            Last name : 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.LastName, new { maxlength = 50 })
            @Html.ValidationMessageFor(model => model.LastName)
        </div>

        <div class="editor-label">
            National number : 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.NumNat, new { maxlength = 11 })
            @Html.ValidationMessageFor(model => model.NumNat)
        </div>

        <div class="editor-label">
            Start date : 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.StartDate, new {@class = "datepicker" })
            @Html.ValidationMessageFor(model => model.StartDate)
        </div>

        <div class="editor-label">
            End date : 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.EndDate, new { @class = "datepicker" })
            @Html.ValidationMessageFor(model => model.EndDate)
        </div>

        <div class="editor-label">
            Distance House - Work (km) : 
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.HouseToWorkKilometers)
            @Html.ValidationMessageFor(model => model.HouseToWorkKilometers)
        </div>

        <div class="editor-label">
            Category : 
        </div>
        <div class="editor-field">
            @Html.DropDownList("Id_ProductPackageCategory", "Choose one ...")
            @Html.ValidationMessageFor(model => model.Id_ProductPackageCategory) <a href = "../ProductPackageCategory/Create">Add a new category?</a>
        </div>

        <div class="editor-label">
            Upgrade? : 
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Upgrade)
            @Html.ValidationMessageFor(model => model.Upgrade)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/bundles/jqueryui")
    @Styles.Render("~/Content/themes/base/css")
    <script type="text/javascript">
        $(document).ready(function () {
            $(".datepicker").datepicker({

            });
        });
    </script>
}

我的 Person 模型中的开始日期:

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.DateTime StartDate
    {
        get
        {
            return _StartDate;
        }
        set
        {
            OnStartDateChanging(value);
            ReportPropertyChanging("StartDate");
            _StartDate = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("StartDate");
            OnStartDateChanged();
        }
    }
    private global::System.DateTime _StartDate;
    partial void OnStartDateChanging(global::System.DateTime value);
    partial void OnStartDateChanged();

有人有解决这个问题的办法吗?

【问题讨论】:

  • jQuery 的日期选择器不返回字符串值吗?你是怎么解析的?
  • 可能是您的代码需要 mm/dd/yyyy 格式的日期时间,而日期选择器返回 dd/mm/yyyy 格式的日期。所以 15 不是一个有效的月份数,它给出了错误。
  • @Forty-Two :老实说,我遵循了一个教程来实现 datepicker 功能,所以除了教程中的代码之外我没有添加任何东西
  • 您在控制器中收到此错误?
  • @Narendra :我也尝试过这个解决方案,但是应用程序显示“该字段必须是日期”作为验证错误消息。

标签: c# jquery asp.net-mvc


【解决方案1】:

首先,您似乎将原始实体传递给您的视图,这不是一个好主意。 MVC 中的正确方法是创建一个视图模型,其中包含视图所需的所有信息,不多也不少。

现在解决您的问题:

当我选择我的日期(实际上是一天大于 12 的日期)时,应用程序会显示一条验证错误消息

这给我的印象是这是一个文化冲突问题,您的 MVC 应用程序期望日期为dd/mm/yyyy,但接收为mm/dd/yyyy。 MVC 中的默认模型绑定器将使用当前线程的文化 - 如果您确定该线程正在使用正确的文化,那么我的猜测是它不喜欢您只传递一个Date 而不是 DateTime,虽然不太可能。

通常最好的方法是使用与文化无关的标准化日期格式,即UTC Format,这样可以避免任何转换问题。

【讨论】:

  • 感谢您的回答!但是,您能给我一个方法/建议吗?
  • @Traffy 具体做什么?我在回答中提出了几点。
  • 事实上,当我将日期格式化为 dd/mm/yyyy 时,它不起作用。错误消息已更改:“字段 StartDate 必须是日期”。我还尝试在我的 web.config 中将文化指定为 auto,如下所示:
  • @Traffy auto 在全球化中会从网站运行的机器中获取文化,根据datepicker documentation 默认格式是mm/dd/yy - 所以直接格式化不会捆绑。我的建议是切换到可以在任一方强制执行的全局日期格式(就像我提到的 UTC 是最常见的,即yyyy-mm-dd)。您想使用哪种文化并不重要,最重要的是您在整个应用中保持一致。
  • 我有一个类似的问题,我试图作弊并直接在视图中使用模型,但这会导致日期时间等字段强制执行数据格式,例如一个我很懒惰的 SQL 日期。我创建了一个合适的视图模型,然后在我的服务层中映射视图模型,因为我将它传递给存储在数据库中的存储库。
猜你喜欢
  • 1970-01-01
  • 2023-01-22
  • 2017-12-10
  • 2017-07-18
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
相关资源
最近更新 更多