-1

尝试创建 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 属性。

4

1 回答 1

0

因此,我模板上的 TextBox 使用位于 ModelStateDictionary 上的“StartDate”键从 KeyValuePair 中获取值。当我的 javascript 调用我的控制器并发生绑定时,此字典已填充('表示尝试将已发布的表单绑定到操作方法的状态'- MDSN)。即使我将 Model.StartDate 的值传递给模板,TextBox 也会优先考虑 ModelStateDictionary 的匹配键!

所以我的解决方法是将模型的开始日期命名为 StartDateVm。正如我在Gary Clarke的帖子中发现的那样,帮助程序的这种行为很有帮助,因此当 ModelState 上已经存在视图模型时,我们不会重复将相同值分配给视图模型的代码。我推荐你加里的帖子。

于 2014-07-06T07:17:23.430 回答