接收数据类型不匹配的调用`EditorFor()`
问题描述:
当我打电话@Html.EditorFor()
从*.cshtml
视图,我接收到错误:接收数据类型不匹配的调用`EditorFor()`
The model item passed into the dictionary is of type `System.Boolean', but this dictionary requires a model item of type 'MyType'.
这就是说,我相信我传递在正确的模型类型。我的代码看起来是这样的:
Html.EditorFor(m => m.MyType, Model.MyType.Template, Model.MyType.Field)
MyType
是绑定到我的每一个EditorTemplate
页面模型。 Template
属性的值对应于EditorTemplate
页面的名称,并且Field
属性的值映射到htmlField名称(均为返回字符串)。
根据该错误,我认为Model.MyType
返回的值为Boolean
而不是MyType
的值,但我确认情况并非如此。我甚至可以写出@Model.MyType.GetType()
并查看它是否正确检索了一个MyType
实例。
答
这很不直观,但如果templateName的值未映射到EditorTemplates
目录中的文件名,则会引发此错误。例如,如果Model.MyType.Template
返回字符串MyTemplate
,但不存在对应的~/Views/Controller/EditorTemplates/MyTemplate.cshtml
。
在这个特殊情况下,有一个错误的Model.MyType.Template
值,它没有正确映射到任何EditorTemplates
。
我想像一个类似的错误会发生与DisplayFor()
。
只要命名您的模板'〜/ Views/Controller/EditorTemplates/MyType.cshtml'来匹配模型,然后它的只是'@ Html.EditorFor(m => m.MyType)' –
@StephenMuecke:是的,准确地说明了这个代码是如何工作的。问题是,如果'm.MyType'值与模板匹配失败(在这种情况下,由于伪造值),那么它会抛出一个不直观的类型不匹配异常。问题解决了,但我在这里发布了它,希望它能帮助别人;否则,鉴于错误消息,很容易误认源。 –
@StephenMuecke:我还应该注意,在我的例子中很难分离_因为'templateName'值是动态设置的,因此模糊了伪造值。 (在我的实际应用中,这是一个循环的一部分,其中大部分值是正确的,但其中一个是不正确的。) –