我的MVC 4 ViewModel具有DateTime属性,并且使用传递给View的正确DateTime(例如,2012年3月13日下午2:30或其他东西)呈现View。
[Required(ErrorMessage = "Please enter the foo date.")]
[DisplayName("Date:")]
public System.DateTime fooDate { get; set; }
在View上,我有一个@ Html.TextBoxFor,它应该显示DateTime:
<div class="form-group col-sm-3">
@Html.LabelFor(m => m.fooDate)
@Html.TextBoxFor(m => m.fooDate, new { @class = "form-control", @placeholder = "MM/DD/YYYY", @data_bind = "value: fooDate" })
@Html.ValidationMessageFor(m => m.fooDate)
</div>
它只显示日期(即3/13/2012),但我希望它显示DateTime。我不知道时间被切断的原因。
WEIRD ISSUES:
检查输入元素,其value
属性是正确的,输入类型是text
(例如,value="8/31/2011 4:00:00 PM"
)。尝试使用jQuery记录value属性会产生8/31/2011
,时间会中断。
我将输入字段绑定到Knockout.JS,如下所示:
fooDate: ko.observable($("#fooDate").attr("value"));
// or
fooDate: ko.observable($("#fooDate").val());
这两个选项都没有产生正确的值:时间被切断了。使用<pre data-bind="text: ko.toJSON($data, null, 2)"></pre>
标记显示observable仅绑定DateTime的Date部分。
我确定传递给View的ViewModel包含完整的DateTime值。
<input>
使用class="form-control hasDatepicker"
呈现,但使用jQueryUI DatePicker在此输入的代码中没有引用。
我该如何调试?问题是什么?
编辑:问题只发生在谷歌浏览器上。
编辑#2 :此问题已通过手动清除Google Chrome的缓存(ugh)解决,与浏览器兼容性,HTML5或Javascript无关。
答案 0 :(得分:1)
如果实际呈现的value
属性保存正确的值并且它是文本输入类型(而不是类似日期),您指出在两个计数上都是真的,那么唯一可能的解释是一些错误的JavaScript是在渲染后操纵值。您的输入具有您未手动添加的类hasDatePicker
这一事实,可以证明这一假设。您可以通过禁用JavaScript进行确认,并确认日期值是否正确。
现在,关于如何解决这个问题,这变得更加棘手。第一步是跟踪页面加载的所有脚本。这可能是页面上的实际脚本标记,但也可以使用require.js,Modernizr等动态加载脚本。由于这是Chrome,请转到开发人员工具中的“资源”选项卡并展开“框架”文件夹和代表您页面的文件夹。在那里你会找到一个“脚本”部分,在那里你将能够看到所包含的所有内容。在找到潜在的违规者后,您将不得不通过JavaScript和HTML来确定其被包含的位置和方式。