只是想知道绑定到MVC视图的ViewData和绑定到@Html辅助对象的ViewData之间的实际区别是什么?
我写了一个页面,它们似乎指的不是同一件事。ViewData是否在应用程序中的其他位置用作隐藏在相同名称下的另一个字典?
发布于 2011-12-14 23:05:47
简短回答:
HtmlHelper的ViewData是基于视图的数据的。所以在输入视图代码(例如,Razor或ASPX页)时,它具有相同的值。但您可以分别更改这些ViewData。
它在AjaxHelper中的用法与此相同。
RepeaterItem有它自己的ViewData,它是基于项目的。
我没有发现任何不同的ViewData在任何地方的用途。
更新:
只有在使用强类型视图时,ViewData和@Html.ViewData才不同。如果使用非强类型视图,则它们与引用是相等的。所以我认为这样做是为了将ViewData包装到强类型的ViewDataDictionary<>中。
一些调查:
我已经看了反编译的源代码,下面是我发现的。
让我们来看看,什么是@Html.ViewData:
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是从HtmlHelper构造函数中的一些viewDataContainer实例化的。
让我们试着看看,这是如何与页面联系起来的:
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。
因此,我们可以看到,基于存储在View中的字典为HtmlHelper实例化了一个新的ViewData字典实例。唯一的选择是,如果它们在内部使用相同的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;
}正如我们所看到的,条目刚刚被复制,但使用了不同的底层_innerDictionary。
https://stackoverflow.com/questions/8433809
复制相似问题