错误的模型类型,但没有传递任何模型。
错误的模型类型,但没有传递任何模型。
我有一个局部视图"_Initial"
,使用的模型是@model Release
在主视图中,我有以下代码:
@if (Model == null || Model.Release == null)
{
@Html.Partial("_Initial")//这里有错误
}
else
{
@Html.Partial("_Initial", Model.Release)
}
主视图使用的模型是@model WorkspaceData
,我无法理解为什么会出现以下错误:
传递给字典的模型项的类型为'WNCT_Web_Application.BL.Workspace.Monitoring.WorkspaceData',但是该字典需要的模型项类型为'WNCT_Web_Application.BL.Release.Release'。
而我甚至没有传递任何模型(局部视图中有处理模型为空的逻辑)?
出现问题的原因是在使用Html.Partial
方法时,没有传递模型给它。解决方法是使用ViewDataDictionary
来发送视图的模型给部分视图。
在使用Html.Partial
方法时,我们可以传递一个模型给它,这样部分视图就可以使用该模型进行渲染。但是有时候可能会忘记传递模型,或者在某些情况下,我们希望在没有传递模型的情况下使用默认的模型。
要解决这个问题,我们可以使用ViewDataDictionary
来发送视图的模型给部分视图。具体的解决方法是在Html.Partial
方法中传递一个空的模型和一个ViewDataDictionary
对象。这样,如果没有传递模型,部分视图就会使用ViewDataDictionary
对象中的模型进行渲染。
下面是解决方法的代码示例:
Html.Partial("_Initial", null, new ViewDataDictionary())
感谢Stephen Muecke提供了ViewDataDictionary
以及它如何将视图的模型发送给部分视图的信息。有了这个解决方法,我们就可以在没有传递模型的情况下使用默认的模型来渲染部分视图了。
在上述内容中,出现了一个问题:(Wrong model type but no model was passed)。这个问题的原因是当我们没有指定模型或者传递的模型为null时,默认情况下Html.Partial
会使用ViewDataDictionary
中的模型(在这个例子中是WorkspaceData
)。为了解决这个问题,我们可以将一个新的Release
实例传递给部分视图.Partial("_Initial", new WNCT_Web_Application.BL.Release.Release())
。
但是,我必须传递null
。正如你从重复的例子中发现的那样,你可以传递new ViewDataDictionary()
,但这可能意味着你有一个(较小的)设计缺陷。部分视图中的任何HtmlHelper都会内部抛出一个异常(当然,全部都能优雅地处理),这就是为什么你应该始终避免传递null模型。最好检查一个默认的ID
属性 - if (model.ID == 0)
或者if (model.ID == null)
。
这些内部异常会影响性能吗?是的,就像任何异常一样,但是影响很小。只是想让你意识到最好尽可能地传递一个模型(就像在控制器方法中应该始终使用return View(model)
而不是return View()
一样)。
只有当视图没有定义模型类型时,我才能使用return View()
吗?即使模型已定义(比如在“创建”方法中),你仍然可以使用return View()
,只是最好初始化一个新的模型实例并将其传递给视图。