gpt4 book ai didi

asp.net-mvc - WebViewPage.ViewData 和@Html.ViewData 的区别

转载 作者:行者123 更新时间:2023-12-01 00:29:17 25 4
gpt4 key购买 nike

只是想知道绑定(bind)到 MVC View 的 ViewData 和绑定(bind)到 @HtmlViewData 之间的实际区别是什么帮助对象?

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

最佳答案

简短回答:
HtmlHelperViewData基于 View 的数据。因此它在输入 View 代码时具有相同的值(例如,Razor 或 ASPX 页面)。但是你可以改变这些 ViewData s 分开。

它在AjaxHelper中的使用方式相同.

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

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

更新:
ViewData@Html.ViewData仅当您使用强类型 View 时才不同。如果您使用非强类型 View ,则它们作为引用是相等的。所以我认为这样做是为了包装 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从一些 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;
}

正如我们所见,条目 a 刚刚被复制,但基础不同 _innerDictionary被使用。

关于asp.net-mvc - WebViewPage.ViewData 和@Html.ViewData 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8433809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com