2017-10-08 36 views
0

当我打电话@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实例。

回答

0

这很不直观,但如果templateName的值未映射到EditorTemplates目录中的文件名,则会引发此错误。例如,如果Model.MyType.Template返回字符串MyTemplate,但不存在对应的~/Views/Controller/EditorTemplates/MyTemplate.cshtml

在这个特殊情况下,有一个错误的Model.MyType.Template值,它没有正确映射到任何EditorTemplates

我想像一个类似的错误会发生与DisplayFor()

+0

只要命名您的模板'〜/ Views/Controller/EditorTemplates/MyType.cshtml'来匹配模型,然后它的只是'@ Html.EditorFor(m => m.MyType)' –

+0

@StephenMuecke:是的,准确地说明了这个代码是如何工作的。问题是,如果'm.MyType'值与模板匹配失败(在这种情况下,由于伪造值),那么它会抛出一个不直观的类型不匹配异常。问题解决了,但我在这里发布了它,希望它能帮助别人;否则,鉴于错误消息,很容易误认源。 –

+0

@StephenMuecke:我还应该注意,在我的例子中很难分离_因为'templateName'值是动态设置的,因此模糊了伪造值。 (在我的实际应用中,这是一个循环的一部分,其中大部分值是正确的,但其中一个是不正确的。) –