ASP.NET MVC ViewData(使用索引)

时间:2020-03-05 18:53:08  来源:igfitidea点击:

我有一个使用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()方法使用反射并查看模型以检索值。索引器仅查看直接添加到词典中的项目。