ASP.NET MVC ViewData(使用索引)
我有一个使用ASP.NET MVC Preview 3(从Preview 2解决方案升级)的有效解决方案,该解决方案使用无类型的ViewMasterPage,如下所示:
public partial class Home : ViewMasterPage
在Home.Master上有一个显示语句,如下所示:
<%= ((GenericViewData)ViewData["Generic"]).Skin %>
但是,团队中的开发人员只是将程序集引用更改为Preview 4.
之后,代码将不再像上面那样用索引值填充ViewData。
而是,ViewData [" Generic"]为null。
根据此问题,ViewData.Eval(" Generic")有效,并且ViewData.Model也正确填充。
但是,此解决方案不使用键入页面等的原因是因为它是一种传统解决方案。这样,遍历这个相当大的解决方案并更新所有.aspx页是不切实际的(特别是因为编译器没有检测到这种东西)。
我尝试通过删除引用然后在项目的" bin"文件夹中添加对Preview 3程序集的引用来还原程序集。这并没有改变任何东西。我什至尝试将Project文件还原为较早的版本,但这似乎仍无法解决问题。
我还有其他使用相同技术的解决方案,这些解决方案可以继续工作。
关于此突然停止工作的原因,我有什么建议?我可以怎么解决(正确方向的任何提示将不胜感激)?
解决方案
回答
我决定用ViewData.Eval(" blah")替换所有ViewData [" blah"]实例。
但是,如果可能,我想知道此更改的原因,因为:
- 如果它发生在我的其他项目中,那么能够修复将是一件很不错的事情。
- 最好保留已部署的工作代码,而不用这些更改覆盖。
- 知道我没有注意到的其他任何变化都很好,这将是很高兴的。
回答
我们如何设置视图数据?这对我有用:
控制器:
ViewData["CategoryName"] = a.Name;
看法:
<%= ViewData["CategoryName"] %>
顺便说一句,我现在正在预览5. 但这已经在3和4上起作用了...
回答
回复:瑞奇
当我从Controller调用View()方法时,我只是传递一个对象。
我还注意到,在未进行任何更新的已部署服务器上,ViewData.Eval失败并且ViewData [" index"]有效。
在我的开发服务器上,ViewData [" index"]失败,ViewData.Eval正常工作...
回答
是的,所以无论我们传入View的什么内容都可以在View中作为ViewData.Model进行访问。但是,如果我们不执行强类型的View,那将只是一个很好的旧对象...
回答
之所以做出更改,是因为我们希望与[]索引器保持一定的对称性。 Eval()方法使用反射并查看模型以检索值。索引器仅查看直接添加到词典中的项目。