【问题标题】:Datetime format postback invalid ModelState日期时间格式回发无效的 ModelState
【发布时间】:2015-08-09 18:24:41
【问题描述】:

在回发验证期间,我在使用 Datetime 属性的 DisplayFormat 属性时遇到问题。

要明确这不是主要问题,但我想了解一种无需“破解”即可使其正常工作的方法,或者只是讨论这一点(如果这是“正常”行为)。

让我们承认我在 DB 中有一些日期时间(例如 10/17/2014 12:00:00 AM)以表格形式显示。我正在使用 DataType(Datatype.Date)DisplayFormat(...) 属性,但是当我发回我的表单时,由于日期时间格式,我的 ModelState 无效。

--MyModel 类文件(.cs)

namespace Package.To.Models {
    public class MyModel 
    {
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0: dd/MM/yyyy}", ApplyFormatInEditMode = true]
        public Datetime myDate { get; set; }

        ...other properties
    }
}

--cshtml文件

  @model Package.To.Models.MyModel

    @using (Html.BeginForm()) {

    @Html.ValidationSummary(true)

    <fieldset>
        <div class="editor-label">
            @Html.LabelFor(model => model.myDate) 
        </div>
        <div class="editor-field">
            <!-- displayed with the good format eg. 17/10/2014 -->
            @Html.EditorFor(model => model.myDate)
        </div>

        <input type="submit" value="Ok" class="button"/>
    </fieldset>
}

--控制器文件(.cs)

[HttpPost]
public ActionResult calledWhenSubmit(MyModel model)
{
  // invalid model.myDate: 1/1/0001 12:00:00 AM

  var errors = ModelState
               .Where(x => x.Value.Errors.Count > 0)
               .Select(x => new { x.Key, x.Value.Errors })
               .ToArray();
  // errors.Errors[0].ErrorMessage: "The value '17/10/2014' is not valid for myDate"
  // errors.Errors[0].Exception._COMPlusExceptionCode: -532462766

  if (ModelState.IsValid) // returning false
  {
    ...some code
  }
  return View();
}

看来,如果我删除 DisplayFormat(...) 属性一切正常(除了显示的日期在表单中的格式错误)。

我在 SO 上发现了很多关于 Datetime 和 ModelState 问题的帖子,但配置中没有任何内容像我得到的那样简单,所以我对我所缺少的东西都很了解

【问题讨论】:

  • 您是否在web.config 文件中设置了文化(即&lt;globalization uiCulture="en" culture="en-US" /&gt;)?
  • 您是否在配置中将文化设置为 en-Gb?
  • 不,我没有在任何地方设置文化
  • 尝试一下,如果它有效,请告诉我们
  • 它没有改变任何东西,同样的错误

标签: c# asp.net-mvc-4 datetime modelstate displayformat


【解决方案1】:

我遇到了同样的问题。尽管您设置了DateFormatString,但控制器验证不理解这种格式,它理解文化格式。您需要在Startup.csConfigureServices 方法中更改它,添加以下代码:

 var cultureInfo = new CultureInfo("en-US");
 CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
 CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2022-06-20
    • 2020-03-10
    • 2021-12-04
    相关资源
    最近更新 更多