尝试创建 EditorTemplate 以生成日期选择器时,发生了一些非常奇怪的事情。传递给模板的值是一个字符串,但正在转换为 Unix 时间戳。这个字符串实际上是以前从控制器上的 Unix 时间戳转换的,然后作为我的 viewModel 中的字符串发送到视图,所以我不知道这两个代码是否以某种方式链接(??)我已将编辑器模板最小化为:
1 @model String
2
3 @Model.ToString()
4 @Html.TextBox("", Model.ToString())
第 3 行打印正确的值“3/7/14”,但第 4 行创建了一个值为“1404309600”的文本框
这真的很令人困惑。有什么帮助吗?谢谢你。
用新信息编辑
在做了更多测试之后,我可以更多地解释问题是什么以及它来自哪里。我正在使用FullCalendar,当我选择一系列日期时,创建新事件的表单会在新的模式窗口中打开。Ajax 路径请求类似于
创建?startDate=1404309600&endDate=1404396000
然后我的控制器填充事件的数据和其他信息,表单包括传递的开始和结束日期,但作为字符串。所有数据都通过 ViewModel 传递给视图。
该视图使用以下代码行调用 EditorTemplate 以生成日期选择器输入:
@Html.EditorFor(model => model.StartDateVm, new { Value = Model.StartDateVm.ToString() })
我用[UIHint("DatePicker")]装饰了参数
所以回到最初的问题:这一行生成一个输入,其中传递给控制器的 Unix 时间跨度的值而不是 ViewModel 的字符串。
经过一番研究,我意识到来自 fullcalendar 的参数称为“startDate”,而我的 ViewModel 上的参数是“StartDate”。我已将 ViewModel 属性名称更改为 StartDateVm 及其对该名称的所有引用,现在输入显示正确的字符串。所以我猜想 TextBox 助手是从浏览器而不是从 ViewModel 获取值的。
我的问题是为什么会这样。现在我知道一种解决方法,但我想了解问题出在哪里。我认为这与MSDN上给出的解释有关,我不完全理解: 按此顺序检索值 - ModelStateDictionary 对象,此参数的值,ViewDataDictionary 对象,最后是 value 属性html 属性。