天道酬勤,学无止境

如何在该 ASP.NET 页面上的另一个用户控件的事件内找到 ASP.NET 页面的用户控件 编辑:不同的内容占位符?(How to find user control of an ASP.NET page inside of event of another user control on that ASP.NET page EDIT: different content placeholders? )

问题

我有一个注册了 2 个用户控件的 ASP.NET 页面。 第一个只有一个按钮。 第二个是简单的文本,默认隐藏。 我想要的是在单击第一个按钮时(即按钮单击事件)使第二个可见。

ASP.NET 页面:

<%@ Page Title="" Language="C#" CodeFile="test.aspx.cs" Inherits="test" %>
<%@ Register Src="~/UC_button.ascx" TagName="button" TagPrefix="UC" %>
<%@ Register Src="~/UC_text.ascx" TagName="text" TagPrefix="UC" %>

<asp:Content ID="Content1" ContentPlaceHolderID="MyTestContent" Runat="Server">
    <UC:button ID="showbutton1" runat="server" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MyTestContent2" Runat="Server">
    <UC:text runat="server" Visible="false" ID="text1" />
</asp:Content>

UC_Button.ascx.cs:

protected void button1_Click(object sender, EventArgs e)
{
    Button btnSender = (Button)sender;
    Page parentPage = btnSender.Page;
    UserControl UC_text = (UserControl)parentPage.FindControl("text1");
    UC_text.Visible = true;
}

我究竟做错了什么? 我得到众所周知的Object reference not set to an instance of an object. 代码的最后一行出现错误。

编辑:

我第一次发帖时忘记提到一件事。 用户控件位于不同的<asp:Content></asp:Content>控件中(我编辑了上面的示例)。 如果我把它们放在同一个占位符代码中就可以了。 如果我将它们放在单独的内容占位符中,我将无法通过 findcontrol 以任何方式找到它们。 为什么会这样,我怎样才能找到它们?

回答1

请检查以下:

UserControl UC_text = (UserControl)this.NamingContainer.FindControl("text1");
回答2

FindControl 方法不会对控件进行深入搜索。 它直接查看您为请求的控件指定的位置。

在您的情况下,您需要做的是:

UserControl UC_text = (UserControl)Content1.FindControl("text1");

您还可以在这里看到我的问题:IEnumerable 和 Recursion using yield return 演示了一种按类型查找深层控件的方法。

回答3

好的,我找到了解决方案,直到更好的解决方案出现。 问题是,正如杰米迪克森指出的那样(谢谢杰米):

The FindControl method does not do a deep search for controls. It looks directly in the location you specify for the control you're requesting.

因此,因为我在不同的内容占位符中有用户控件,所以我必须首先找到目标占位符(用户控件所在的位置),然后我可以在其中搜索用户控件:

protected void Dodaj_Feed_Panel_Click(object sender, EventArgs e)
    {
        ContentPlaceHolder MySecondContent = (ContentPlaceHolder)this.Parent.Parent.FindControl("MyTestContent2");

        UserControl UC_text = (UserControl)MySecondContent.FindControl("text1");
        UC_text.Visible = true;
    }

真正让我烦恼和困惑的是this.Parent.Parent部分,因为我知道这不是最好的解决方案(如果我稍微更改层次结构,此代码会中断)。 这部分代码实际上做的是它在页面层次结构中向上两级(即两个用户控件所在的页面)。 我不知道与this.Page有什么区别,因为对我来说它意味着相同但对我不起作用。

长期解决方案将类似于服务器端“类似 jQuery 的选择器”(它可以找到元素,无论它们在层次结构中的哪个位置)。 有人有更好的解决方案吗?

回答4

使用用户控件的 id,然后将控件(例如文本框)放在面板内,然后从主页尝试此代码

例子:

TextBox txt = (TextBox)showbutton1.FindControl("Textbox1");

使用 udpatepanel 更新: TextBox txt = (TextBox)showbutton1.FindControl("Textbox1"); txt.Text="你好世界!";

((UpdatePanel)showbutton1.FindControl("UpdatePanel1")).Update();

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 出现在我的文本框asp.net中的modalpopupextender和逗号(modalpopupextender and commas appearing in my textbox asp.net)
    问题 发生了一些奇怪的事情,我正在转换一个用于使用javascript的应用程序,以便在一个很小的窗口中打开另一个网页,以便使用ModalPopupExtender进行数据输入。 似乎工作正常,但是在OK事件中,当我执行txtData.Text(模式弹出窗口中的文本框)时,它在数据前返回一个逗号,因此,如果您键入“ Rabbit”,则返回为“ ,兔子”。 同样,当我多次使用它时,在另一个我可能单击以显示它的地方,然后键入“ Fish”,它开始返回诸如“,Rabbit ,, Fish”之类的内容。 我不知道为什么或如何阻止它执行此操作...有什么想法吗? 回答1 由于某种原因,如果文本框设置为ReadOnly,则似乎不会发生。 我在想可能有一种解决方法,即向用户显示可编辑的文本框,捕获其击键,并更新对用户隐藏的只读文本框。 仍然有些混乱,但是我无法回退到May的发行版,因为该发行版中还有一个ComboBox的错误需要避免! 更新: 作为背景知识,我在模式弹出窗口中有一个用户控件(ascx),因为我需要重用它。 ascx必须自己处理用户的输入(包含页面不知道控件内部发生了什么),因此当用户单击按钮时,我会进行回调并处理数据。 如果成功的结果返回给客户端回调函数,那么我将模拟单击包含页面认为是“ OK”按钮的按钮,该按钮实际上对用户是不可见的。 我已经更改了代码
  • 在Asp.Net中动态添加的控件(Dynamically added controls in Asp.Net)
    问题 我试图把头包在asp.net上。 我有很长一段时间的php开发人员背景,但是现在我面临着学习asp.net的任务,并且遇到了一些麻烦。 这很可能是因为我正试图将框架强制用于其不适合的用途-所以我想学习如何以“正确的方式”进行操作。 :-) 我的问题是如何在运行时以编程方式向页面添加控件。 据我所知,您需要在page_init中创建控件,否则它们将在下一个PostBack中消失。 但是很多时候,我遇到的问题是我不知道要在page_init中添加哪个控件,因为它取决于以前的PostBack中的值。 一个简单的场景可能是在设计器中添加了下拉控件的表单。 下拉菜单设置为AutoPostBack。 当发生PostBack时,我需要呈现一个或多个依赖于下拉控件中所选值的控件,并且最好使这些控件的行为就像设计中添加的一样(如“发回时,表现为”正确”)。 我在这里走错了路吗? 回答1 我同意这里的其他观点:“如果您可以摆脱动态创建控件的行为,那就去做吧……”(@ Jesper Blad Jenson aka着),但这是我过去使用动态创建控件解决的一个技巧。 问题是鸡肉和鸡蛋。 您需要使用ViewState创建控件树,并且需要创建控件树才能获取ViewState。 好吧,那几乎是正确的。 有一种方法可以在填充树的其余部分获取ViewState值。 那是通过重写LoadViewState(
  • 在 ASP.net MVC 站点中查看 SSRS 报告(Viewing SSRS Reports in an ASP.net MVC Site)
    问题 有没有办法将 SQL Server Reporting Services 报表查看器控件放在 ASP.net MVC 视图上? 如果没有......实现这一目标的最佳方法是什么? 回答1 不,不是在 MVC 视图中。 但是您可以拥有一个 Web 表单页面,其中包含与您的 MVC 站点混合的服务器控件。 嗯,只是在谷歌上搜索“混合 asp.net mvc 和网络表单”以找到一些示例,谷歌质疑我是否是人类:) 无论如何,这里有一个链接 - http://www.packtpub.com/article/mixing-asp.net-webforms-and-asp.net-mvc - 那里有一些。 出于同样的原因,我也在 MVC 站点中完成了此操作 - 报告控件。 回答2 不,如果您将 ReportViewer 控件放置在 MVC 视图中,它将无法工作,因为它需要 ViewState。 您必须创建一个老式的 Web 表单并将 ReportViewer 放在那里。 我在一个项目中使用的一个解决方案是创建一个自定义路由处理程序,这样我仍然可以使用 URL 路由。 路由处理程序将从 RouteData 集合中获取诸如报告名称之类的参数,创建我的 Web 表单的一个实例,并通过公共属性将参数传递给它。 Web 表单将在 Page_Load 中读取这些内容并配置 ReportViewer
  • ASP.NET母版页和内容页中的表单元素(Form Elements in ASP.NET Master Pages and Content Pages)
    问题 好的,我当前项目中的另一个坎bump。 我从来没有在我的两个主页和内容页的表单元素,我倾向于把所有形式的内容的相关指令。 但是,在当前项目中,我们有一个页面,他们需要两者。 右上方的登录表单和内容中的问题表单。 试图弄明白这一点之后,我遇到了ASP.NET的问题,抱怨在母版页中需要单个表单元素。 TBH,我真的不明白为什么这是ASP.NET的要求,但是,嘿。 有谁知道/是否/如何使母版页和内容页包含独立工作的表单元素? 如果没有,您能否提供有关如何继续获得所需外观/功能的建议? 回答1 以为我会回顾一些悬而未决的问题,看看是否可以解决其中的一些问题。 这是一个有趣的。 我完全拒绝相信您只能在ASP.NET页面上使用一种表单。 这对我来说毫无意义。 我已经看到很多网页在一个网页上具有多个表单,为什么ASP.NET页应该有所不同? 所以,这让我开始思考。 为什么ASP.NET页需要表单元素? ASP.NET页尝试通过PostBack模型提供状态持久性来模拟WinForms环境。 这为无状态环境提供了状态元素。 为此,运行时需要能够在每个“表单”中维护此状态。 它通过将数据回传到自身来实现。 重要的是要注意: 关于PostBack并没有真正的幻想。 它使用来自任何其他堆栈的HTTP形式和POST(与任何其他形式相同)。 仅仅因为看起来它可能正在做一些特别的事情,不是这样
  • 用户控件之间的 ASP.NET 事件委托(ASP.NET Event delegation between user controls)
    问题 在 ASP.NET 页面上给出以下控件层次结构: 页 HeaderControl(用户控件) TitleControl(服务器控制) TabsControl(用户控件) 其他控件 我正在尝试在 TitleControl 中引发一个事件(或某些通知),该事件冒泡到Page级别。 然后,我想(可选)在页面代码隐藏处注册一个事件处理程序,它将采用EventArgs并修改上面示例中的 TabsControl。 需要注意的重要一点是,如果事件处理程序连接起来,这种设计将允许我将这些控件放入任何页面,并使整个系统无缝运行。 该解决方案不应涉及对FindControl()的调用,因为这会成为强关联。 如果在包含的 Page 中未定义处理程序,则 TitleControl 仍会引发该事件,但不会对其进行处理。 我的基本目标是使用基于事件的编程,以便我可以将用户控件彼此分离。 来自 TitleControl 的事件仅在某些情况下引发,这似乎是(在我看来)首选方法。 但是,我似乎无法找到一种干净地实现这一目标的方法。 这是我的(糟糕的)尝试: 使用 HttpContext.Current.Items 将 EventArgs 添加到 TitleControl 上的 Items 集合,并在 TabsControl 上选取它。 这是有效的,但从根本上很难破译,因为两个控件之间的联系并不明显。
  • asp.net 用户控件不会在 updatepanel 中触发 javascript(asp.net usercontrol won't fire javascript inside updatepanel)
    问题 我见过类似的问题和答案,但似乎没有一个能解决这个问题。 我在更新面板中有一个用户控件。 在我的用户控件中,我输出 javascript。 javascript 不会在触发时触发。 如果我将 javascript 移动到 usercontrol/updatepanels 之外的父页面,那么它就会触发。 这没有意义,因为我不能在另一个页面上使用这个用户控件而不复制代码......通过复制整个 javascript(不同的站点)或在它使用的每个页面中添加对 .js 文件的引用在(同一站点)。 它只是不那么便携 我只想输出带有控件的 javascript(在更新面板内)。 提到更新面板是为了确保我正在做的事情的准确性。 即使我将用户控件放在更新面板之外,它也不起作用。 保持简单(这对我不起作用): 用户控制: <%@ Control Language="C#" AutoEventWireup="true" CodeFile="_location.ascx.cs" Inherits="_location" %> <script type="text/javascript"> function test() { alert('Hello World!'); } </script> <a href="javascript:void(0);" onclick="javascript:test
  • Asp.net Usercontrol LoadControl问题(Asp.net Usercontrol LoadControl Issue)
    问题 使用LoadControl( type, Params )时遇到问题。 让我解释... 我有一个超级简单的用户控件(ascx) <%@ Control Language="C#" AutoEventWireup="True" Inherits="ErrorDisplay" Codebehind="ErrorDisplay.ascx.cs" EnableViewState="false" %> <asp:Label runat="server" ID="lblTitle" /> <asp:Label runat="server" ID="lblDescription" /> 后面有代码(c#): public partial class ErrorDisplay : System.Web.UI.UserControl { private Message _ErrorMessage; public ErrorDisplay() { } public ErrorDisplay(Message ErrorMessage) { _ErrorMessage = ErrorMessage; } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); if (_ErrorMessage != null)
  • 单击按钮后禁用页面刷新 ASP.NET(Disable page refresh after button click ASP.NET)
    问题 我有一个看起来像这样的 asp 按钮: 默认.aspx <asp:button id="button1" runat="server" Text="clickme" onclick="function" /> 默认.aspx.cs protected void function(object sender EventArgs e) { // Do some calculation } 但是,每当我按下按钮时,整个页面都会刷新。 我查看了这个站点并找到了许多解决方案,但没有一个真正适用于我的项目。 以下是一些建议的解决方案: 设置 onclick="返回假;" // 但是我如何在代码隐藏中运行该函数? 在 Page_Load 中使用 !IsPostBack // 但页面仍然完全刷新。 我根本不想调用 Page_Load。 禁用 AutoEventWireup。 // 使这个 true 或 false 没有区别。 有没有人有解决方案,或者真的不可能? 回答1 我会将控件放在“更新”面板中。 为此,您还需要在其上方安装一个脚本管理器,如下所示: <asp:ScriptManager runat="server" ID="sm"> </asp:ScriptManager> <asp:updatepanel runat="server"> <ContentTemplate> <asp
  • 什么是回发?(What is a postback?)
    问题 我正在进入Web开发,并且看到了回发这个词。 来自非基于Web的背景,新的Web开发人员必须了解有关回发的信息吗? (即它们是什么,它们何时出现?) 您希望与他人分享任何有助于网络新手了解回发信息的信息,将不胜感激。 回答1 以下是针对ASP.Net的初学者的... 什么时候发生? 回发源自客户端浏览器。 通常,页面上的一个控件将由用户操纵(单击按钮或更改下拉菜单等),并且此控件将发起回发。 该控件的状态以及页面上的所有其他控件(称为“查看状态”)被发布回Web服务器。 怎么了? 最常见的是,回发使Web服务器在启动回发的页面的类后面创建代码实例。 然后,该页面对象会在正常页面生命周期内执行,但会有细微差别(请参见下文)。 如果您没有在页面生命周期内将用户专门重定向到其他页面,则回发的最终结果将是再次向用户显示同一页面,然后可能发生另一次回发,依此类推。 为什么会发生? Web应用程序正在Web服务器上运行。 为了处理用户的响应,导致应用程序状态更改或移至其他页面,您需要获取一些代码以在Web服务器上执行。 实现此目的的唯一方法是收集用户当前正在处理的所有信息,并将其全部发送回服务器。 初学者需要注意的一些事情是... 在上下文中可以使用回发页面上控件的状态。 这将使您能够操纵页面控件或根据那里的信息重定向到另一个页面。 就像任何其他控件一样,Web窗体上的控件具有事件
  • 如何在ASP.NET 4.5中使用C#在转发器中使用linkbutton(How to use linkbutton in repeater using C# with ASP.NET 4.5)
    问题 在asp.net中,我在数据库中有一个表,其中包含问题,提交日期和答案。在页面加载时,仅出现问题。然后再次点击该链接,答案就消失了,就像点击时的扩大和缩小一样。 那么我应该在C#中使用什么编码呢? 回答1 我相信您可以处理Repeater的ItemCommand事件。 将一个LinkBut​​ton控件放置在您希望用户在“ Repeater”的项目模板中单击的链接上。 将此的CommandName属性设置为有意义的内容,例如“ ShowAnswers”。 另外,将Label或TextBox控件添加到Repeater的项目模板中,但在aspx标记中将其Visible属性设置为false。 在后面的代码中,在ItemCommand事件处理程序内,检查e.CommandName的值e.CommandName等于您的命令(“ ShowAnswers”)。 如果是这样,则在该Repeater项(可通过e.Item访问)中找到答案和日期的Label或TextBox控件。 找到它们后,将其Visible属性设置为true。 注意:您可以采用另一种方法来使用AJAX为用户提供更无缝的体验,但是这种方法一开始可能很容易实现。 我认为实现看起来像这样。 免责声明:我尚未测试此代码。 后台代码: void Repeater_ItemCommand(Object Sender
  • asp.net 在回发后动态添加用户控件保存值(asp.net dynamically added user control saving values after postback)
    问题 这是我的问题。 我有一个用户控件,我想允许用户根据需要使用按钮单击添加尽可能多的实例(每次单击按钮时,我想将我的用户控件的另一个实例添加到面板)。 第一次运行正常,但每次额外的回发都会删除所有添加的控件。 跟踪用户添加的用户控件数量没有问题,但我如何确保它们保持与回发之前相同的状态? 我读过一些关于人们使用 SaveViewState 和 LoadViewState 的帖子,但我找不到任何例子。 我最大的问题是确保每个用户控件的所有文本框和下拉列表在每次回发后都填充相同的文本/选定值/数据 提前致谢,本 回答1 由于您是以编程方式向页面添加控件,因此您需要在每次回发时重新创建它们。 此外,您有必要在页面的PreInit或Init事件上重新创建以编程方式添加的控件。 这是为了正确的视图状态恢复事件管理。 如果你不这样做,控制将在回发时消失,他们不会处理任何事件。 编辑 尽管建议在PreInit或Init上动态添加控件,但如果将它们添加到page_load上,它可能会起作用(正如 Dustin Hodges 所说)。 我会说你应该避免它,除非你别无选择。 您可能能够在 Page_Load 事件处理程序中加载您的控件并正确维护视图状态。 这完全取决于您是否以编程方式设置动态加载控件的任何属性,如果是,则取决于您何时相对于 Controls.Add(dynamicControl)
  • 【使用ASP.NET开发Web项目】第一课——初识ASP.NET,创建第一个ASP.NET程序
    知识点:理解 ASP.NET 的概念和优势、 会创建 ASP.NET Web Form 程序、 理解 ASP.NET Web Form 程序的执行阶段、 会使用代码内嵌和代码后置两种方式进行编码。 1、网站开发基础了解 1.1 网站开发各环节组成 1.2 开发网站需要的知识结构 (1)网站开发前台页面技术 页面设计:HTML、DIV+CSS页面特效:JavaScript、jQuery (2)OOP编程核心公共技能 C#基础语法与程序逻辑面向对象编程基础SQL Server数据库开发基础ADO.NET数据访问技术 (3)网站开发后台专门技术 ASP.NET开发基础基于WebForm开发企业网站MVC框架学习EF框架学习基于MVC+EF开发企业网站 2、 ASP.NET概述 通过学习 HTML+CSS我们会制造静态页面了。静态页面的最大的优点是速度快,可以跨平台,跨服务器。在早期网站建设大多都是静态页面制作的,静态页面的网址是以.HTM、HTML 等为后缀的,在这种静态网站上也可以由动态效果,像滚动字幕,GIF 格式的动画,或是FLASH,这些视觉上的动态效果并不就是动态页面,他们是截然不同的概念。所谓动态网页,就是说该网页文件不仅具有 HTML 标记,而且含有服务器端的脚本程序代码, 实现操作数据库、实现交互等功能。动态网页能根据不同的时间,不同的来访者显示不同的内容
  • 处理 asp.net 页面上的 Web 用户控制错误(Handling Web User Control error on asp.net page)
    问题 您如何处理 Web 用户控制事件? 我注意到我的自定义 Web 用户控件有一个事件调用 OnError 但是当我调整控件失败时它永远不会触发。 该控件基本上是一个自定义的 gridview 控件。 我在网上搜索网络用户控制事件处理,但我还没有找到一篇文章来解决我所寻找的问题。 有人可以做一个快速解释或指出我正确的方向吗? 谢谢 回答1 您没有提到 ASP.NET 的风格,所以我假设 VB - C# 大体相同,除了事件处理程序的附加方式。 您希望看到的正常模式是这样的: 用户控件“MyUserControl”代码隐藏 Public Event MyEvent(ByVal Sender As Object, ByVal e As EventArgs) Private Sub SomeMethodThatRaisesMyEvent() RaiseEvent MyEvent(Me, New EventArgs) End Sub 页面设计器代码 Private WithEvents MyUserControl1 As System.Web.UI.UserControls.MyUserControl 包装 MyUserControl 实例 CodeBehind 的页面或其他控件 Private Sub MyUserControlEventHandler(ByVal Sender As
  • ASP.NET的隐藏功能(Hidden Features of ASP.NET [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 存在此问题是因为它具有历史意义,但是对于本站点而言,它不是一个很好的主题问题,因此,请勿将其用作您可以在此处提出类似问题的证据。 更多信息:https://stackoverflow.com/faq 在边缘场景中总会有一些有用的功能,但是由于这个原因,大多数人都不了解它们。 我要的是教科书通常不教授的功能。 你知道些什么? 回答1 在测试期间,您可以将电子邮件发送到计算机上的文件夹而不是SMTP服务器。 将其放在您的web.config中: <system.net> <mailSettings> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" /> </smtp> </mailSettings> </system.net> 回答2
  • ASP.NET:如何重定向,预填充表单数据?(ASP.NET: How to redirect, prefilling form data?)
    问题 我希望处理程序重定向到Web表单页面,预先填写表单上某些控件的值。 我试图设置我当前的Request.Form数据: if (theyWantToDoSomething) { //pre-fill form values context.Request.Form["TextBox1"] = "test"; context.Request.Form["ComboBox1"] = "test 2"; context.Request.Form["TextBox2"] = GetTheTextForTheThing(); //tell the client to go there context.Response.Redirect("~/SomeWebForm.aspx"); return; } 但是我得到一个例外,即Form值是只读的。 将客户发送到另一页并预先填写表单数据的方法是什么? 回答 我使用了会话状态来存储值。 重要的是要注意,默认情况下,处理程序无权访问Session (Session对象将为null )。 您必须通过将IRequiresSessionState标记接口添加到处理程序类来告诉IIS为您提供Session对象: public class Handler : IHttpHandler, System.Web.SessionState
  • 如何使用asp.net从另一个用户控件调用用户控件的方法?(How can i call method from usercontrol from another usercontrol using asp.net?)
    问题 我有两个用户控件: UserControl1和UserControl2 ,这些控件添加在 Page.aspx 中。 UserControl1 :此用户控件包含此用户控件中隐藏文本框的方法。 这个方法叫做“ HideTextbox ” UserControl2 :我想从UserControl2调用方法“ HideTextBox ”。 如何从UserControl2调用HideTextBox方法? 回答1 仅当两者都是用户控件或服务器控件,或者您正在从用户控件中查找服务器控件时,此操作才会起作用。 (不是来自服务器控件,因为您无法获得对 asp.usercontrol_xx 程序集的引用) 首先获取对父页面的引用(通常这可以通过this.Parent完成。接下来在父页面上执行递归 FindControl 以查找类型为UserControl2 。示例代码: //this for extension method public static UserControl2 FindUserControl2Recursive(this Control root) { var uc2 = root as ASP.UserControls_UserControl2_ascx; if (uc2 != null) { return uc2; } foreach (var control in
  • 如何检查是否由动态链接按钮引起的回发(How to check whether postback caused by a Dynamic link button)
    问题 我有一个按钮控件。 单击此按钮后,我需要动态添加链接按钮。 链接按钮需要一个事件处理程序。 因此,动态链接按钮首先添加到Page_Load中,然后清除并再次添加到按钮单击处理程序中。 请阅读Dynamic Control的事件处理程序的工作,以了解对此的业务需求。 我已经阅读过回发,如何在Page_Init事件中检查哪个控件导致回发,以标识导致回发的控件(在Page_Load内部)。 但这不适用于我的情况。 需要进行哪些更改以确认回发是否是由链接按钮(在Page_Load内部)引起的? 注意:不可避免的另一种情况请参考以下内容:https://codereview.stackexchange.com/questions/20510/custom-paging-in-asp-net-web-application 注意1:我需要获取回发控件ID作为if (Page.IsPostBack)内部的第一步。 仅当它是来自按钮或链接按钮的回发时,才需要添加动态链接按钮控件。 还会有其他导致回发的控件。 对于此类回发,我们不应执行此代码。 注意2:我在Page_Load中获取Request["__EVENTARGUMENT"]空字符串 相关问题:通过什么event ,页面中将提供动态控件(用于FindControl中)。 @Tung说-
  • ASP.NET网站还是ASP.NET Web应用程序?(ASP.NET Web Site or ASP.NET Web Application?)
    问题 在Visual Studio中启动新的ASP.NET项目时,可以创建ASP.NET Web应用程序,也可以创建ASP.NET网站。 ASP.NET Web应用程序和ASP.NET网站之间有什么区别? 我为什么要选择一个呢? 根据我使用的Visual Studio版本,答案是否有所不同? 回答1 网站: 该Web站点项目是即时编译的。 您最终将获得更多的DLL文件,这可能会很痛苦。 当您在一个目录中有页面或控件需要引用另一目录中的页面和控件时,这也会带来问题,因为该另一目录可能尚未编译到代码中。 另一个问题可能是在发布中。 如果不要求Visual Studio不断重复使用相同的名称,它将为页面始终生成的DLL文件提供新的名称。 这可能会导致具有相同类名的DLL文件的多个紧密副本,这将产生大量错误。 该Web站点项目是随Visual Studio 2005一起引入的,但事实证明它并不受欢迎。 Web应用程序: Web应用程序项目是作为外接程序创建的,现在作为Visual Studio 2005的SP 1的一部分存在。主要区别在于Web应用程序项目的设计工作原理与Visual Studio 2003附带的Web项目类似。在构建时将应用程序编译为单个DLL文件。 要更新项目,必须重新编译该项目并发布DLL文件以进行更改。 Web应用程序项目的另一个不错的功能是
  • ASP.NET 重定向和结束页面(ASP.NET Redirect and End Page)
    问题 所以我阅读了很多关于如何正确使用 Response.Redirect 而不会导致一些错误的信息。 Response.Redirect(url, false); Context.ApplicationInstance.CompleteRequest(); 情况:用户登录站点并访问列出表单的页面。 用户在该页面上坐了一个小时什么都不做(这会使他们注销)。 用户单击按钮来编辑标题(这需要回发)。 这导致用户对象为空,因为它将他从会话中注销。 我做了什么:在页面加载中,检查用户对象是否为空,如果是,则重定向到登录页面。 那是应该发生的事情吗? 问题:按钮事件仍在触发。 是因为我有以下代码行吗? Context.ApplicationInstance.CompleteRequest(); 当我只想重定向到登录页面时,如何阻止事件被触发? 我知道我可以在重定向代码中提供 true ,但这也会导致错误吗? Response.Redirect(url, true); 我目前所做的(这不是我所知道的最好的方法):在按钮事件中,我再次检查用户对象是否为空。 如果不为空,则继续代码编辑标题(记录谁编辑它)。 这是一种糟糕的处理方式。 我所看到的:用 Response.IsRequestBeingRedirected 包装所有事件。 但是如果我有几个页面和很多按钮事件,这可能会有点烦人。
  • 投票 - 从客户端停止滥用 - ASP.NET MVC(voting - stopping abuse from client side - ASP.NET MVC)
    问题 所以我设计了这个投票的东西,它不会让某人在 24 小时内为同一篇文章投票两次。 但是,假设一个人投票,并且在看到该人能够投票或他在 24 小时窗口内失败后,我禁用了投票按钮(顺便说一句,这都是 Ajax)。 但是当一个人关闭他/她的浏览器并返回甚至刷新页面时该怎么办? 显然,由于我的算法,他将无法投票,但此人最终仍会成功调用服务器。 因此,如果他真的想要,他会不断刷新页面并单击投票并给服务器带来不必要的负载。 如何通过做某种客户端的事情来避免这种情况? 我正在使用 ASP.NET MVC,所以会话变量是不可能的。 我是不是太在意这个了? 回答1 如果投票仅由登录(已知)成员进行,那么您应该没有任何问题。 另一方面,如果每个人都可以投票,那么您需要存储所有用户投票事件: 时间戳轮询 poll_vote ip 用户代理用户唯一性 cookie 所以你需要一个随机散列作为 cookie 发送出去。 这将确保您不会接受同一个人对同一民意调查的另一票。 如果用户删除了他的 cookie,您将退回到计划 B,在该计划中,您在 24 小时内不允许来自同一 IP 和用户代理组合的投票超过(例如)10 票。 该系统并不完美,因为用户可以更改 IP 和(更容易)用户代理。 您需要高级模式检测算法来检测可疑投票。 存储所有用户投票事件的好处是您可以稍后使用调度程序处理这些事件