只是想知道绑定到MVC视图的ViewData
和绑定到ViewData
辅助对象的@Html
之间的实际差异是什么?
我写了一个页面,他们似乎没有提到同样的事情。 ViewData
是否在应用程序中的其他任何位置用作隐藏在同一名称下的另一个字典?
答案 0 :(得分:7)
简短回答:
HtmlHelper
的{{1}}基于视图的数据。因此在输入视图代码时它具有相同的值(例如,Razor或ASPX页面)。但您可以单独更改这些ViewData
。
它在ViewData
中使用相同的方式。
AjaxHelper
拥有自己的ViewData,它基于该项目。
我没有在任何地方找到任何不同的RepeaterItem
。
<强>更新强>
仅当您使用强类型视图时,ViewData
和ViewData
才有所不同。如果使用非强类型视图,则它们都等于参考。所以我认为这样做是为了将@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;
}
。