show only the date in @Html.EditorFor helper
我正在尝试填充@Html.EditorFor助手。 我使用以下属性创建了一个视图模型
1 2 3
| [DataType(DataType.Date, ErrorMessage="Date only")]
[DisplayFormat(DataFormatString ="{0:dd/MM/yy}", ApplyFormatInEditMode = true)]
public DateTime? YearBought { get; set; } |
我的助手如下所示(a)
1 2
| @Html.ValidationMessageFor(m => m.YearBought)
@Html.EditorFor(model => model.YearBought, new { @type ="date" }) |
我也尝试过(b)
1 2
| @Html.ValidationMessageFor(m => m.YearBought)
@Html.EditorFor(model => model.YearBought.Value.Date) |
使用上述格式(a)不会显示任何内容。 使用上述格式(b)12/05/2014 00:00:00以文本框格式显示。
我正在尝试实现不显示时间的日期选择器格式
我已经审查了其他几个问题,但看不到我做了什么不同的事情。
当我查看数据库时,该值另存为2014-05-12,当我保存该值时,EditorFor helper生成所需的输入工具
问题复习
第一,第二,第三...
编辑
刚刚在chrome开发工具中打开了控制台,因此此消息
The specified value"12/05/14" does not conform to the required format,"yyyy-MM-dd"
我以为DisplayFormat(DataFormatString ="{0:dd/MM/yy}"正在定义如何显示我的日期?
-
额外的@type有什么用? 在@Html.EditorFor(model => model.YearBought, new { @type ="date" })中,如果您使用EditorFor,则不能指定htmlattributes,所以很好奇
-
@type date是使它工作的最后一个尝试,除此之外没有其他逻辑:
-
相关:stackoverflow.com/questions/15943797/
使用type="date"时需要使用ISO格式
1 2 3
| [DataType(DataType.Date, ErrorMessage="Date only")]
[DisplayFormat(DataFormatString ="{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime? YearBought { get; set; } |
这将在浏览器区域性中显示日期。
请注意,无需添加@type ="date"。 EditorFor()方法将由于DataType属性而添加该内容。另请注意,type="date"仅在Chrome中受支持(FireFox和IE只会生成普通文本框)
如果确实要在标准文本框中显示格式dd/MM/yyyy,则可以使用
1
| @Html.TextBoxFor(m => m.YearBought,"{0:dd/MM/yyyy}") |
-
当我在Editor中使用相同的语法时,它将不起作用@ Html.EditorFor(m => m.YearBought," {0:dd / MM / yyyy}")
-
@AshishShukla,因为EditorFor()不支持该语法。您只需要@Html.TextBoxFor(m => m.YearBought)-EditorFor() method respects values in the DataType`和DisplayFormat属性
-
要使用@Html.EditorFor(),您必须将格式指定为yyyy-MM-dd,而不像上面的TextBoxFor中所示。像Ashish一样,它可能会使某些人困惑,认为您可以将EditorFor格式使用该格式-您不能,您不能。但是即使使用模型属性,仅执行@Html.EditorFor(m => m.YearBought)绝对是不够的。见我的答案:stackoverflow.com/questions/33247295/
正如斯蒂芬的回答中所说,您必须使模型中的标签之间的格式与视图中显示的格式匹配,并且无论您实际想要如何显示,都应为yyyy-MM-dd(ISO)格式日期:
1 2 3 4 5 6 7 8 9 10 11
| using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
// .... your namespace .... your class....
[DisplayName("Year Bought")]
[DataType(DataType.Date, ErrorMessage="Date only")]
[DisplayFormat(DataFormatString ="{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime? YearBought { get; set; } |
他是对的,因为我们有[DataType(DataType.Date)],所以我们在View的HtmlAttributes中不需要@type = date。
我的答案与他的不同之处在于,如何将模型中的值实际应用于视图上的控件。由于YearBought是Nullable,因此我们必须使用.Value以某种方式将其值设置为:
1 2 3
| @Html.EditorFor(model => model.YearBought,
new { htmlAttributes = new { @class ="form-control datepicker",
@Value = Model.YearBought.Value.Date.ToString("yyyy-MM-dd") } }) |
密切注意设置.ToString("yyyy-MM-dd")。不过,它不会显示在这样的框中-至少对我来说-可能是因为我在计算机上的美国区域设置会接管并将其显示为MM/dd/yyyy。这可能会使一些人困惑,但是最好只是"做"而不用担心。
如果YearBought只是笔直的DateTime而不是DateTime?,则没有.Value:
1 2 3 4
| @Html.EditorFor(model => model.YearBought,
new { htmlAttributes = new { @class ="form-control datepicker",
@Value = Model.YearBought != null ?
Model.YearBought.Value.Date.ToString("yyyy-MM-dd") : null } }) |
-
使用HtmlHelper方法时,永远不要设置value属性(除非您试图破坏模型绑定)。
-
@StephenMuecke我的模型绑定已经搞砸了,因为没有它,它就无法工作。做上面的事情是我唯一能做的。我发布此邮件是因为我想其他人也可能会发生。
-
您还有其他原因导致它。通过首先从ModelState,然后从ViewDataDictionary,最后从实际模型值中读取属性,所有生成表单控件的HtmlHelper方法都正确设置了value属性。
-
@StephenMuecke不要这样认为。我有一个ViewModel我正在使用,就像上面一样。 myViewModel.startdt = DateTime.Now;用return View("MyView", myViewModel);将其传递到我的视图,并在顶部显示using @model TestSite.ViewModels.MyViewModel。我所有的EditorFor()框都很好,可以在表单回发后从模型中发布,但是如果未设置@Value,则我要填充日期的EditorFor()框只是" mm / dd / yyyy"。顺便说一句,我不是唯一使用它的答案:stackoverflow.com/questions/15943797/
-
来自mvc初学者的另一个错误答案,该初学者不知道他们在做什么或HtmlHelper方法如何工作(在没有看到代码的情况下,我所能做的就是猜测您正在尝试在拥有一个值之后更改控制器中的值。已添加到ModelState)
-
@StephenMuecke我在做什么我必须很普遍,我认为我不是新手,也许不像您那样高级。正如我所说,这是回传到表单上。我在执行return View(myViewModel);的控制器Index()中设置了一个带有一些预填充属性(不是开始日期,而是创建者,创建日期等)的空模型。我上载读取属性并设置myViewModel.startdt = DateTime.Now;的文件Upload()后,单击"保存"按钮,然后执行return View("Index", myViewModel);用我的新值更新原始模型。正如我所说,只有日期才有问题。
-
让我们继续聊天中的讨论。
除了HTML type属性之外,还可以在MVC中使用EditorTemplate来放置为已知的C#数据类型(如DateTime)呈现自定义编辑器所需的标记,CSS和JS。
这是在MVC中创建自定义" EditorTemplate"的演练(尽管不是日期数据类型,但是概念相同)
为了使操作最简单,我将视图模型的YearBought属性设置为String。服务器可以格式化日期,可以在回发时进行解析,并且您仍然可以使用DataType.Date数据注释进行jQuery验证。这也可以确保显示值恰好是提交给视图之前所需的值。