我一直在遵循this教程来学习带有实体框架的ASP.NET Core MVC。我的问题是,当我运行解决方案并尝试使用浏览器在Students表上添加新条目时,它会自动以MM / dd / yyyy的形式强加日期格式,如here所示。我想要它的格式为yyyy-MM-dd。
我的学生模型如下:
public class Student
{
public int StudentID { get; set; }
[Required]
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Required]
[Display(Name = "First Name")]
public string FirstMidName { get; set; }
[Display(Name = "Enrollment Date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime EnrollmentDate { get; set; }
public ICollection<Enrollment> Enrollments { get; set; }
}
在我看来,日期输入的实现方式如下:
<div class="form-group">
<label asp-for="EnrollmentDate" class="control-label"></label>
<input asp-for="EnrollmentDate" class="form-control" />
<span asp-validation-for="EnrollmentDate" class="text-danger"></span>
</div>
甚至更奇怪的是,指定的格式在索引页面中可显示表格中每个学生的输入格式之外的输入格式(例如here)上工作。
我似乎在任何地方都找不到解决此问题的方法,大多数人只是说要在数据注释上添加ApplyFormatInEditMode = true
,它应该可以工作。
感谢您的帮助,谢谢!
答案 0 :(得分:0)
Sean T指出here已经存在一个解决方案。
显然,这与C#或任何内容无关,与浏览器处理日期输入并尝试使用用户更熟悉的格式有关。
因此,要更改Google Chrome(我使用的浏览器)上的这种行为,我遵循了these步骤。
作为参考,这里是在Firefox中如何操作的说明。无法找到Opera,Edge似乎无法更改它,或者与Windows的区域设置(see this)绑定。
答案 1 :(得分:0)
由于EnrollmentDate上的[DataType(DataType.Date)]声明而发生此问题。呈现页面时,此元素将转换为
<input type="date">
当浏览器看到此内容时,它将在输入元素上强加自己的内部日期选择器(如果支持)。这是Mozilla网站上所有信息的不错的link。
一个问题是每个浏览器都有自己的样式/约定,这会导致跨平台的不同用户体验。
您可以编写一小段JavaScript,以覆盖客户端上的数据类型,并用通用的JavaScript替换浏览器的日期选择器。这个例子只是
$("input[type=date]")
.datepicker({ dateFormat: "yy-m-d", changeYear: true, yearRange: "-4:+0" })
.attr("type", "text");
请注意,在最后一行中,我们如何将type属性更改为text。
一个问题是,它依赖于视图模型日期格式来进行初始加载,而使用数据选择器时要格式化的javascript。