【问题标题】:MVC Date Culture IssueMVC 日期文化问题
【发布时间】:2015-08-24 05:21:16
【问题描述】:

我正在使用 ASP.NET MVC 5 和 ASP.NET 4.51。我正在尝试将我的日期验证为 dd/MM/yyyy,例如。 1960 年 1 月 31 日,但模型验证不断告诉我这是一个无效的日期。

遵循其他 SO 帖子的建议:

我的 web.config 中有以下内容:

<system.web>
    <globalization uiCulture="en" culture="en-AU" />
</system.web>

我的视图模型如下所示:

public class PassengerItem
{
    public PassengerItem()
    {
        DateOfBirth = new DateTime(1960, 1, 1);
    }

    [Required]
    [DataType(DataType.Date)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime DateOfBirth { get; set; }
}

public class BookingProcessViewModel
{
    /// <summary>
    ///     Class constructor
    /// </summary>
    public BookingProcessViewModel()
    {
        ErrorMessages = new List<string>();
        Passengers = new List<PassengerItem>();

        //Populate with 10 passengers. We show/hide these in the view. Currently we only allow a max of 4 pax to be booked at a time
        for (int i = 0; i < 4; i++)
        {
            Passengers.Add(new PassengerItem());
        }
    }

    public List<PassengerItem> Passengers { get; set; }
}

控制器被 POST viz 击中:

    [HttpPost]
    public ActionResult Process(BookingProcessViewModel aViewModel)
    {
    }

但我总是在模型状态下得到以下错误:

日期的数据输入是使用带有以下 HTML 的 jQueryUI 完成的:

<input aria-invalid="false" class="form-control hasDatepicker valid" 
data-jqui-dpicker-changemonth="True" 
data-jqui-dpicker-changeyear="True" 
data-jqui-dpicker-constraininput="True" 
data-jqui-dpicker-dateformat="dd/mm/yy" 
data-jqui-dpicker-defaultdate="01/01/1901" 
data-jqui-dpicker-maxdate="24/08/2015" 
data-jqui-type="datepicker" id="Passengers_0__DateOfBirth" 
name="Passengers[0].DateOfBirth" value="31/01/1960" type="text">

所以客户端验证正在通过,但服务器端存在问题,我无法弄清楚。这让我发疯了。任何人都可以解释一下吗?

【问题讨论】:

    标签: c# asp.net-mvc date


    【解决方案1】:

    web.config文件更改为(两者都必须是en-AU

    globalization uiCulture="en-AU" culture="en-AU" />
    

    DefaultModelBinder 使用uiCulture 的值将值转换为DateTime(请注意您的屏幕截图中的Culture: {en}

    旁注。你有[DataType(DataType.Date)],如果你使用@Html.EditorFor(),它将生成浏览器HTML5日期选择器,这意味着你需要使用DataFormatString = "{0:yyyy-MM-dd}"才能正常工作。

    【讨论】:

    • 将 web.config 更改为culture="en-AU" 但这没有任何区别。我正在使用 jQueryUI 来弹出一个日期选择器,而不是 EditorFor。我已经在我的原始帖子中包含了为此生成的相关 HTML。
    • 对我来说很好。再次检查您的屏幕截图 - 现在是 Culture: {en-AU} 吗?请注意,该视图与问题无关 - 它传递回 31/1/1960 with 是澳大利亚文化的有效日期字符串(并且由于您使用 jquery 插件,因此没有真正需要 [DataType(DataType.Date)] 其唯一目的是呈现type="date" 属性)
    • 嗯。出于某种原因,文化仍然是 Culture: {en}。仔细检查,网络配置肯定是 。我可以在代码中设置文化吗?
    • 奇怪。您是否使用任何自定义模型绑定器?你检查过 ISS 中网站的文化吗?
    • 我没有使用任何奇怪的模型活页夹。我通过覆盖我的基本控制器构造函数并在那里设置文化来完成这项工作。当我强迫它在那里时,它可以工作。所以谢谢你的帮助。弄清楚为什么这种文化是 en 我将单独追踪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多