C# 调用'EditorFor()时接收到的数据类型不匹配`
当我从C# 调用'EditorFor()时接收到的数据类型不匹配`,c#,asp.net-mvc,razor,asp.net-mvc-5.2,C#,Asp.net Mvc,Razor,Asp.net Mvc 5.2,当我从*.cshtml视图调用@Html.EditorFor()时,我收到错误: 传入字典的模型项的类型为“System.Boolean”,但此字典需要“MyType”类型的模型项 这就是说,我相信我通过了一个正确类型的模型。我的代码如下所示: Html.EditorFor(m => m.MyType, Model.MyType.Template, Model.MyType.Field) MyType是绑定到每个myEditorTemplate页面的模型。模板属性的值对应于编辑模板页面的
*.cshtml
视图调用@Html.EditorFor()
时,我收到错误:
传入字典的模型项的类型为“System.Boolean”,但此字典需要“MyType”类型的模型项
这就是说,我相信我通过了一个正确类型的模型。我的代码如下所示:
Html.EditorFor(m => m.MyType, Model.MyType.Template, Model.MyType.Field)
MyType
是绑定到每个myEditorTemplate
页面的模型。模板
属性的值对应于编辑模板
页面的名称,而字段
属性的值映射到htmlField name(两个返回字符串)
基于错误,我希望
Model.MyType
返回的是Boolean
值,而不是MyType
值,但我已确认情况并非如此。我甚至可以写出@Model.MyType.GetType()
,查看它是否正确地检索MyType
实例。它是不直观的,但是如果templateName的值没有映射到EditorTemplates
目录中的文件名,就会抛出此错误。例如,如果Model.MyType.Template
返回字符串MyTemplate
,但没有相应的~/Views/Controller/EditorTemplates/MyTemplate.cshtml
在这个特殊的例子中,有一个错误的Model.MyType.Template
值,它没有正确映射到任何EditorTemplates
我想,
DisplayFor()
也会发生类似的错误,这是不直观的,但是如果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
值是动态设置的,因此掩盖了伪值。(在我的实际应用程序中,这是一个循环的一部分,其中大多数值是正确的,但有一个不正确。)我的意思是,你不需要模板
和字段
id的属性,你只需遵循正常的命名约定,将模板命名为与类相同的名称。@StephenMuecke:啊,是的,我现在明白你的意思了。在我的实际代码中,它有点复杂,因为我在模板和类之间有一个1:n的关系,因此Template
属性。但你是正确的;如果没有这个要求,你的方法会更加优雅。只需将模板命名为~/Views/Controller/EditorTemplates/MyType.cshtml
,以匹配模型,然后将其命名为@Html.EditorFor(m=>m.MyType)
@StephenMuecke:是的,这正是这段代码的工作原理。问题是,如果m.MyType
值与模板不匹配(在本例中,由于伪值),则它将抛出非直观的类型不匹配异常。问题解决了,但我把它贴在这里,希望它能帮助其他人;否则,如果给出错误消息,很容易错误识别源。@StephenMuecke:我还应该注意,在我的例子中很难隔离,因为templateName
值是动态设置的,因此掩盖了伪值。(在我的实际应用程序中,这是一个循环的一部分,其中大多数值是正确的,但有一个不正确。)我的意思是,你不需要模板
和字段
id的属性,你只需遵循正常的命名约定,将模板命名为与类相同的名称。@StephenMuecke:啊,是的,我现在明白你的意思了。在我的实际代码中,它有点复杂,因为我在模板和类之间有一个1:n的关系,因此Template
属性。但你是正确的;如果没有这一要求,您的方法将更加优雅。