WebViewPage.ViewData和@ Html.ViewData之间的区别

时间:2011-12-08 15:59:57

标签: asp.net-mvc

只是想知道绑定到MVC视图的ViewData和绑定到ViewData辅助对象的@Html之间的实际差异是什么?

我写了一个页面,他们似乎没有提到同样的事情。 ViewData是否在应用程序中的其他任何位置用作隐藏在同一名称下的另一个字典?

1 个答案:

答案 0 :(得分:7)

简短回答:
HtmlHelper的{​​{1}}基于视图的数据。因此在输入视图代码时它具有相同的值(例如,Razor或ASPX页面)。但您可以单独更改这些ViewData

它在ViewData中使用相同的方式。

AjaxHelper拥有自己的ViewData,它基于该项目。

我没有在任何地方找到任何不同的RepeaterItem

<强>更新
仅当您使用强类型视图时,ViewDataViewData才有所不同。如果使用非强类型视图,则它们都等于参考。所以我认为这样做是为了将@Html.ViewData包装成强类型ViewData


一些调查:

我看过反编译的来源,这就是我找到的。

让我们看看,什么是@ Html.ViewData:

ViewDataDictionary<>

正如我们所见,namespace System.Web.Mvc { public class HtmlHelper<TModel> : HtmlHelper { private ViewDataDictionary<TModel> _viewData; public ViewDataDictionary<TModel> ViewData { get { return this._viewData; } } public HtmlHelper(ViewContext viewContext, IViewDataContainer viewDataContainer) : this(viewContext, viewDataContainer, RouteTable.Routes) { } public HtmlHelper(ViewContext viewContext, IViewDataContainer viewDataContainer, RouteCollection routeCollection) : base(viewContext, viewDataContainer, routeCollection) { this._viewData = new ViewDataDictionary<TModel>(viewDataContainer.ViewData); } } } 是从ViewData构造函数中的某些viewDataContainer实例化的。

让我们试着看看,这与页面有什么联系:

HtmlHelper

所以当前页面是namespace System.Web.Mvc { public abstract class WebViewPage<TModel> : WebViewPage { // some code public override void InitHelpers() { base.InitHelpers(); // ... Html = new HtmlHelper<TModel>(ViewContext, this); } // some more code } }

因此,我们看到,viewDataContainer字典的新实例基于字典实例化ViewData,字典存储在HtmlHelper中。唯一的选择,如果他们在内部使用相同的View,可能会使两者有点相同。我们来检查一下。

这是Disctionary构造函数:

ViewData

我们可以看到,刚刚复制的条目,但使用了不同的基础 public ViewDataDictionary(ViewDataDictionary dictionary) { if (dictionary == null) { throw new ArgumentNullException("dictionary"); } foreach (var entry in dictionary) { _innerDictionary.Add(entry.Key, entry.Value); } foreach (var entry in dictionary.ModelState) { ModelState.Add(entry.Key, entry.Value); } Model = dictionary.Model; TemplateInfo = dictionary.TemplateInfo; // PERF: Don't unnecessarily instantiate the model metadata _modelMetadata = dictionary._modelMetadata; }