只是想知道ViewData
绑定到MVC视图和ViewData
绑定到@Html
辅助对象的实际区别是什么?
我写了一个页面,他们似乎没有提到同样的事情.是ViewData
其他任何地方使用的应用程序作为另一个字典下的同名隐藏?
答案很简单:
在HtmlHelper
的ViewData
基于视图的数据.因此在输入视图代码时它具有相同的值(例如,Razor或ASPX页面).但是你可以ViewData
单独更改这些.
它以相同的方式使用AjaxHelper
.
RepeaterItem
拥有自己的ViewData,它基于该项目.
我没有发现任何ViewData
地方的任何使用.
更新:
ViewData
而且@Html.ViewData
只有当你使用一个强类型的观点是不同的.如果使用非强类型视图,则它们都等于参考.所以我认为这样做是为了将其包装ViewData
成强类型ViewDataDictionary<>
.
一些调查:
我已经看了反编译的来源,这是我发现的.
让我们看看,什么是@ Html.ViewData:
namespace System.Web.Mvc { public class HtmlHelper: HtmlHelper { private ViewDataDictionary _viewData; public ViewDataDictionary 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 (viewDataContainer.ViewData); } } }
正如我们看到的,ViewData
是从一些实例viewDataContainer
中HtmlHelper
构造.
我们试着看看,这与页面有什么联系:
namespace System.Web.Mvc { public abstract class WebViewPage: WebViewPage { // some code public override void InitHelpers() { base.InitHelpers(); // ... Html = new HtmlHelper (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; }
正如我们所看到的,条目只是被复制,但使用了不同的底层_innerDictionary
.