首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebViewPage.ViewData与@Html.ViewData的区别

WebViewPage.ViewData与@Html.ViewData的区别
EN

Stack Overflow用户
提问于 2011-12-08 23:59:57
回答 1查看 1.2K关注 0票数 2

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

我写了一个页面,它们似乎指的不是同一件事。ViewData是否在应用程序中的其他位置用作隐藏在相同名称下的另一个字典?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-14 23:05:47

简短回答:

HtmlHelperViewData是基于视图的数据的。所以在输入视图代码(例如,Razor或ASPX页)时,它具有相同的值。但您可以分别更改这些ViewData

它在AjaxHelper中的用法与此相同。

RepeaterItem有它自己的ViewData,它是基于项目的。

我没有发现任何不同的ViewData在任何地方的用途。

更新:

只有在使用强类型视图时,ViewData@Html.ViewData才不同。如果使用非强类型视图,则它们与引用是相等的。所以我认为这样做是为了将ViewData包装到强类型的ViewDataDictionary<>中。

一些调查:

我已经看了反编译的源代码,下面是我发现的。

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

代码语言:javascript
复制
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实例化的。

让我们试着看看,这是如何与页面联系起来的:

代码语言:javascript
复制
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构造函数:

代码语言:javascript
复制
    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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8433809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档