我有一个文本框绑定到DateTime模型字段的视图。
风景:
@Html.TextBoxFor(model => model.StartDate, new { @class = "datepicker", id = "startDate" })
该模型:
[Required(ErrorMessageResourceType = typeof(Resources.ValidationMessages), ErrorMessageResourceName = "GeneralRequired")]
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
[DataType(DataType.Date)]
[Display(Name = "StartDate", ResourceType = typeof(Resources.Something))]
public DateTime? StartDate { get; set; }
View使用jQuery datepicker处理日期输入。jQuery仅生成日期,但据我所知,C#中没有唯一的日期类型。
我也使用自定义的DateTime模型绑定程序,但发布代码(tl; dr;))相当大。
当用户在文本框中输入例如15-01-2015并将其发布到方法时,模型绑定程序会将其正确转换(转换为15-01-2015 12:00)。问题在于,由于表单上有两个日期时间字段而触发了验证,并且如果用户仅输入其中一个,则操作方法将返回带有验证消息的视图。已经输入的字段仍应明显填写。问题在于,当控制器的操作方法返回视图时,它将日期时间(而不只是日期)放置到文本框中。
我们有什么方法可以仅将日期而不是日期和时间传递给视图中的绑定字段?还是保持字段绑定但只显示value.Date在文本框中?
编辑:
我曾尝试应用Hugo Delsing的解决方案,但面临下一个问题。基本上,我们将对模型的DateTime字段使用EditorTemplate。DateTime.cshtml如下所示:
@model System.DateTime?
@if (Model == null)
{
@Html.TextBox(
string.Empty,
"",
new { @class = "datepicker", @type = "text" })
}
else
{
@Html.TextBox(
string.Empty,
Model.ToString("dd-MM-yyyy"),
new { @class = "datepicker", @type = "text" })
}
据我所知,问题出在生产线上
Model.ToString(“ dd-MM-yyyy”)
因为抛出错误是
Shared \ EditorTemplates \ DateTime.cshtml(13):错误CS1501:方法'ToString'没有重载需要1个参数
据我了解,就像别人总是在评估,对吗?有什么解决方案可以在不将if语句移到主视图并构建类似内容的情况下实现我想要的东西吗?
@if(model.StartDate.HasValue)
{
@Html.EditorFor(model => model.StartDate, "TemplateFirst")
}
else
{
@Html.EditorFor(model => model.StartDate, "TemplateSecond")
}
我正常工作的唯一方法是创建一个新的EditorTemplate
。
在中创建一个~/Views/Shared/EditorTemplates
名为的视图,DateTime.cshtml
并将以下内容放入其中。
@model System.DateTime?
@{
var val = "";
if (Model != null)
{
val = ((DateTime)Model).ToString("dd-MM-yyyy");
}
}
@Html.TextBox(
string.Empty,
val,
new { @class="datepicker", @type = "text"})
现在,如果您调用默认的编辑器模板,它将可以使用并始终显示datepicker
for日期。
<div class="editor-container">
<div class="editor-label">
@Html.LabelFor(model => model.StartDate)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.StartDate)
@Html.ValidationMessageFor(model => model.StartDate)
</div>
</div>
@type = "text"
正如Stephen Muecke指出的那样,这并不是真正需要的。这是默认值。您可以添加/更改它以date
触发HTML5日期选择器。请记住,它可能会在“ MM-dd-yyyy”中显示HTML5日期选择器,然后就无法验证该值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句