如何存储 ASP.NET CommandName 和 CommandArgument 值?

How ASP.NET CommandName and CommandArgument values are stored?

提问人:Bakhshi 提问时间:5/8/2012 更新时间:5/8/2012 访问量:8728

问:

有谁知道控件的 CommandName 和 CommandArgument 属性存储在哪里?我对检索它们不感兴趣,只是为了更多地了解 ASP.NET 内部结构以及将来的页面大小考虑。:)

我创建了一个简单的页面,其中包含 3 个按钮,其 commandArg 和 CommandName 设置如下:

<asp:Button Text="Click1" runat="server" CommandArgument="1" CommandName="Delete" OnCommand="CommandExec" />
<asp:Button Text="Click2" runat="server" CommandArgument="2" CommandName="Save" OnCommand="CommandExec" />
<asp:Button Text="Click3" runat="server" CommandArgument="3" CommandName="Copy" OnCommand="CommandExec" />

将 CommandArgument 或 CommandName 更改为相当大的值不会影响 ViewState 内容和大小,那么这些值存储在哪里?

谢谢

C# asp.net .NET 视图状态

评论

0赞 Tim Schmelter 5/8/2012
west-wind.com/weblog/posts/2006/Feb/20/......尽管在评论中有人说“CommandName/CommandArgument 不应该与 ViewState 有任何关系”。

答:

2赞 ahaliav fox 5/8/2012 #1

它保存在视图状态中, 请看这篇文章: http://www.west-wind.com/weblog/posts/2006/Feb/20/ViewState-and-OnItemCommand-on-an-ASPNET-Repeater

2赞 Tim B James 5/8/2012 #2

这些值确实存储在ViewState

如果您要使用带有和不带有 CommandArguments/Names 等按钮的简单按钮进行测试......然后你可以看到 ViewState 更大。GridView

但是,这些值永远不会是真正的大对象或任何东西,所以我个人不会担心它。

评论

0赞 Bakhshi 5/8/2012
谢谢 Tim,但比较这两个(我提到的示例和网格示例)不支持 ViewState 存储模型。GridView 非常复杂,并且非常依赖于 ViewState 的内部状态。但是在这里,您可以将大文本粘贴到 CommandArguemnt 中,甚至不会稍微改变 ViewState 大小!
0赞 Tim B James 5/8/2012
我想说的是,如果您担心 ViewState 的大小,那么您可能应该考虑迁移到 .只是因为您不使用 ViewState,并且对所有内容都有很好的控制权。asp.net-MVC
0赞 Bakhshi 5/8/2012
是的,你是对的。我最近了解了 MVC,我非常得心应手:)
2赞 Joe 5/8/2012 #3

如果你想了解 ASP.NET 内部结构,我仍然认为最好的书是 Nikhil Kothari 和 Vandana Datye 合著的《开发 ASP.NET 服务器控件和组件》。它是为 .NET 1.x 编写的,所以有点过时,但仍然很好地涵盖了基本架构。

在您的示例中,ViewState 大小不受影响的原因是,在处理标记时,在 Init 阶段不会跟踪 ViewState。在标记中设置为固定值的属性值将在编译 ASP.NET 页时生成的代码中进行硬连线。

这篇 MSDN 文章很好地概述了 ViewState。

如果将按钮放在数据绑定控件(如 repeater 或 GridView)中,并使用数据绑定语法为每一行的 CommandArgument 设置不同的值,则会看到 ViewState 增长。

评论

0赞 Bakhshi 5/8/2012
谢谢Joe,我检查了输出标记中的ViewState大小。感谢您的书籍推荐,但我仍然强调参数必须保存在 ViewState 以外的其他位置。
0赞 Bakhshi 5/8/2012
我强调的原因是,如果我提交按钮并将参数保存在页面上的标签中,则视图状态(现在包含参数)将增长!这表明视图状态(如果包含参数)必须相对较大。
1赞 Joe 5/8/2012
@Bakhshi,在示例中,它们保存在编译页面时生成的代码中,因为它们是在标记中定义的固定值。如果它们是动态值,例如在数据绑定期间生成,则它们将存储在 ViewState 中。
0赞 Bakhshi 5/8/2012
啊哈!你是对的!标记是源:D谢谢你的观点。我将 commandARgument 赋值从标记更改为代码,结果正如你们所说的那样。
0赞 Tim Schmelter 5/8/2012
您可能还想看看这篇文章,它深入解释了视图状态:weblogs.asp.net/infinitiesloop/archive/2006/08/03/...请注意,ViewState 不用于 IsItemDirty==false(未更改)的控件。