ASP.NET MVC ViewData(使用索引)

ASP.NET MVC ViewData(使用索引)

ASP.NET MVC ViewData (using indices)

我有一个使用ASP.NET MVC Preview 3(从Preview 2解决方案升级)的有效解决方案,该解决方案使用无类型的ViewMasterPage,如下所示:

1
public partial class Home : ViewMasterPage

在Home.Master上有一个显示语句,如下所示:

1
<%= ((GenericViewData)ViewData["Generic"]).Skin %>

但是,团队中的开发人员只是将程序集引用更改为Preview4。

此后,代码将不再使用上面的索引值填充ViewData。

相反,ViewData [" Generic"]为null。

根据此问题,ViewData.Eval(" Generic")有效,并且ViewData.Model也正确填充。

但是,此解决方案未使用键入的页面等的原因是因为它是一种传统解决方案。因此,遍历这个相当大的解决方案并更新所有.aspx页是不切实际的(特别是因为编译器没有检测到这种东西)。

我尝试通过删除引用然后在项目的" bin"文件夹中添加对Preview 3程序集的引用来还原程序集。这并没有改变任何东西。我什至尝试将Project文件还原到较早的版本,但这似乎仍然无法解决问题。

我还有其他使用相同技术的解决方案可以继续使用。

关于此突然停止工作的原因,您有什么建议?我可以如何解决(建议正确方向的任何提示)?


我们进行了此更改,因为我们希望与[]索引器保持一定的对称性。 Eval()方法使用反射并查看模型以检索值。索引器仅查看直接添加到字典中的项目。


是的,因此您传递给View的任何内容都可以在View中作为ViewData.Model进行访问。但是,如果您不执行强类型的Views ...

,那将只是一个很好的旧对象。


回复:Ricky

当我从Controller调用View()方法时,我只是传递一个对象。

我还注意到在未进行任何更新的已部署服务器上,ViewData.Eval失败并且ViewData [" index"]有效。

在我的开发服务器上,ViewData [" index"]失败,并且ViewData.Eval工作正常...


您如何设置视图数据?这对我有用:

控制器:

1
ViewData["CategoryName"] = a.Name;

查看:

1
<%= ViewData["CategoryName"] %>

顺便说一句,我现在正在预览5。但这已经在3和4上起作用了...


我决定将ViewData [" blah"]的所有实例替换为ViewData.Eval(" blah")。
但是,如果可能,我想知道此更改的原因,因为:

  • 如果它发生在我的其他项目中,那么能够修复将是一件很不错的事情。
  • 最好保留已部署的工作代码,而不用这些更改覆盖。
  • 很高兴知道我没有注意到的其他任何变化。

  • 推荐阅读