代码改变世界

关于使用Html.RenderPartial和Html.Partial显示分部视图时提示参数错误的BUG

2012-06-13 10:33  Sam tsai  阅读(1248)  评论(0编辑  收藏  举报

今天在使用使用Html.RenderPartial和Html.Partial显示分部视图时遇到了一个颇为奇怪的问题:

视图页面A:

@model DataResult

@Html.Partial("_B", Model.Data as System.Data.DataRow)

分部视图B:

@model System.Data.DataRow

 

视图A的Model我使用的是一个自定义的类型,其中包含一个Data属性类型为System.Data.DataRow

分部视图B的Model我使用的是System.Data.DataRow

按理说我这么调用分部视图B应该完全没问题啊

@Html.Partial("_B", Model.Data as System.Data.DataRow)

但实际情况却刚好相反,调用时一直提示:

传入字典的模型项的类型为“MvcWeb.Models.DataResult”,但此字典需要类型“System.Data.DataRow”的模型项。

谷歌了一下,终于找到问题的原因:

原来当我调用分部视图(B)传递的第二个参数Model为null时,系统默认会传递当前视图(A)的model,因为我使用的Model类型不一样,所以提示类型不匹配;网上有人说这应该是一个BUG,但我不明白的是,如果是Bug为什么迟迟没有修复呢?

这是网友提交的BUG:

http://aspnet.codeplex.com/workitem/8872

这是网上的一些相关讨论:

http://stackoverflow.com/questions/4865162/asp-mvc-partial-with-model-and-viewdatadictionary-how-do-i-access-the-viewdata

http://stackoverflow.com/questions/650393/asp-net-mvc-renderpartial-with-null-model-gets-passed-the-wrong-type

不管这到底是一个BUG还是微软mvc团队就是这么设计的,当前解决的办法是:

1.调用分部视图之前判断一下传递的参数是否为空(null),这应该不难,程序似乎本来也应该这么写。

2.传递三个参数,也就是使用三个参数的重载方法来调用。

我个人比较倾向于第一种,如果你有更好的方法,请不吝赐教。