在尝试创建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&安培;结束日期= 1404396000
然后我的控制器填充事件的数据,在其他信息中,表单包括传递的开始和结束日期,但作为字符串。所有数据都传递给视图到ViewModel。
该视图使用以下代码行调用EditorTemplate来生成一个datepicker输入:
@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对象,最后,html属性中的value属性。
答案 0 :(得分:0)
因此我的模板上的TextBox从KeyValuePair获取值,其中包含生活在ModelStateDictionary上的'StartDate'键。当我的javascript调用我的控制器并且发生绑定时('表示尝试将已发布的表单绑定到操作方法'-MDSN),填充了该字典。即使我将Model.StartDate的值传递给模板,TextBox也优先使用ModelStateDictionary的匹配键!
所以我的解决方法是给我的模型的起始日期命名为StartDateVm。正如我在Gary Clarke帖子中发现的那样,帮助程序的这种行为很有帮助,因此当ModelState上已经存在相同的值时,我们不会重复为视图模型分配相同的值。我推荐你加里的帖子。