当前位置:  开发笔记 > 后端 > 正文

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

如何解决《WebViewPage.ViewData和@Html.ViewData之间的区别》经验,为你挑选了1个好方法。

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

我写了一个页面,他们似乎没有提到同样的事情.是ViewData其他任何地方使用的应用程序作为另一个字典下的同名隐藏?



1> Alexander Ye..:

答案很简单:
HtmlHelperViewData基于视图的数据.因此在输入视图代码时它具有相同的值(例如,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是从一些实例viewDataContainerHtmlHelper构造.

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

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实例化了一个新的字典实例.唯一的选择,如果他们在内部使用相同,可能会使两者有点相同.我们来检查一下.HtmlHelperViewDisctionary

这是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.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有