ASP.NET Classic 不使用 WebForm_PostBackOptions 的默认选项创建按钮回发

Posted

技术标签:

【中文标题】ASP.NET Classic 不使用 WebForm_PostBackOptions 的默认选项创建按钮回发【英文标题】:ASP.NET Classic don't create button postback with default options of WebForm_PostBackOptions 【发布时间】:2021-12-13 20:44:09 【问题描述】:

我不明白出了什么问题。我有 ASP:BUTTON

 <asp:Button runat="server" id="btnQuestion" PostBackUrl="~/PositionForm.aspx"  

OnClick="btnQuestion_Click">

并且有事件来处理回发

 protected void btnQuestion_Click(object sender, EventArgs e)

ASP.NET 环境创建此事件

<input type="submit" name="ctl00$MainContent$btnQuestion" value="Задати питання" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$MainContent$btnQuestion&quot;, &quot;&quot;, false, &quot;&quot;, &quot;../../PositionForm.aspx&quot;, false, false))" id="MainContent_btnQuestion" >

很遗憾,我没有看到回发,即使我在浏览器中手动执行

WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContent$btnProposal", "", false, "", "../../PositionForm.aspx", false, false))

只有当我将过去的参数更改为 true 时,我才会看到回发。 这些参数是

  (eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit)

所以如果我手动将 clientSubmit 参数从 false 更改为 true,我可以收到回发。但是为什么 ASP.NET 环境将最后一个参数设置为 false?还是其他地方出了什么问题?

【问题讨论】:

为什么你在 2021 年使用 WebForms? "但是为什么 ASP.NET 环境将最后一个参数设置为 false?" - 您可能启用了 WebForm 的内置表单输入验证 - 它使用客户端逻辑将您的表单验证为无效,但您的表单没有任何地方可以显示验证错误消息。你有&lt;asp:ValidationSummary&gt; 元素吗?浏览器控制台中是否显示任何内容? 根据我的经验,我发现许多 WebForm 对 古老、有缺陷、不安全等 版本的 jQuery 有硬编码的依赖关系,这些版本很容易破坏 - 所以这是需要考虑的一件事。 另外,您的.browser 文件是最新的吗?你在使用 ASP.NET AJAX` 吗?这也可以破坏回发。 @Dai,感谢您的关注。 (1) ASP.NET 我所知道的最安全、最快速的环境。过去一年我都在 Blazor 中编写,结果是性能比 ASP.NET 经典版低 10 倍。并且很多历史站点都使用了 ASP.NET Classic。普通的互联网企业没有足够的钱重写所有网站并遵循愚蠢的微软想法——禁止 jQuery、禁止 Visual Studio ASP.NET 设计器、禁止 VB.NET、禁止 Visual Studio 大师调整 ASP.NET 控件等等。程序员没有足够的时间和金钱来学习新的愚蠢的 MS 技术,这些技术给我们的性能比 ASP.NET Classic 高 10%。 【参考方案1】:

所以,我最终解决了这个问题。这不是儿童网站或演示网站,这是真正的 ASP.NET 网站,每页中有上千个按钮。

我尝试增加 maxRequestLength 或其他 ASP.NET 调整均未成功。 __DoPostBack 即使我手动执行也不起作用。

我无法理解确切的原因 - JS 超时或其他限制,但我的最终解决方案看起来像

  <asp:Button runat="server" id="btnQuestion" ClientIDMode="Static" CausesValidation="false" PostBackUrl="~/PositionForm.aspx" Text="Question" ></asp:Button> 

并且比我需要的参数(当然不是所有 1000 个长隐藏字段,但我在回发中需要一些隐藏字段)

 $("#btnQuestion").attr("onclick", "$.ajax(type:'POST',url:'/PositionForm.aspx', data:  '__EVENTTARGET': 'btnQuestion');");

当然,在这种情况下服务器事件不会自动链接。 IsPostback 事件需要自行分离处理。

【讨论】:

【参考方案2】:

同时拥有按钮点击事件或回发网址是零意义。

我的意思是,post-back url 意味着、假设、建议,简单意味着按钮单击是导航到整个新页面。这当然意味着您导航到的另一个新页面将在第一个页面加载时使用 post-back = false。

但是,您不能(不应该)将两个功能都挂在一个按钮上。如果那个按钮点击是对当前页面进行操作,那么当然需要去掉回发的url。

所以,那个按钮的一般操作不应该有一个post-back url,也不需要一个。

那么,回发网址是什么?

两个巨大的原因。

首先,您当然可以设置一个按钮来导航/跳转到新页面,并且无需代码后面。所以这很方便。

但原因和功能真的很重要吗?

您何时使用回发网址跳转到另一个页面? 您还可以使用 page.Previous!!!!

这意味着在新页面上,您可以从上一页中选择任何值、任何控件。不用说,这可以为您节省大量的参数、session() 值以及谁知道您可能想要或曾经用来传递值的其他内容。

所以即使是gridview文本框中选中的一行,前一页的整个shebang都可以用在目标页中。

但只在第一页加载!!

不过,这是一笔巨大的交易。

但是,如果那个按钮不只是跳转到另一个页面?然后去掉post-back url,你不需要,不要它,用post-back URL到你所在的同一个页面是没有意义的。事实上,这样做会重新加载整个页面,并且第一次回发将是错误的。

因此,如果您确实使用按钮的回发网址功能,那么在目标页面中,如前所述,使用它是非常棒的,因为所有以前的控件及其值都可以被拾取并用于那个目标页面。

所以,如果我设置回发网址,那么在目标页面中,我现在可以从调用页面中获取任何控件,如下所示:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then

        ' get value of text box 1 from pevious page

        Dim txt1 As TextBox
        txt1 = Page.PreviousPage.FindControl("TextBox1")
        Debug.Print("text box 1 from previous page = " & txt1.Text)


    End If
End Sub

请记住,您只能在第一页加载时执行上述操作(回发 = false)。

但是,毫无疑问,这可以为您节省大量参数或使用 session() 从调用页面传递大量值。

总结:

setting post-back URL of a button is ONLY of use to navigate to a new page.

setting post-back URL means you don't have to write or have a button event
behind, and it MAKES NO SENSE to have a event stub, since clicking the
button is assumed to jump/navigate to a NEW web page.

setting and use of post-back gets you that fantastic magic trick of being
able to use page.Previous to pick up any and all controls from that
previous page.

底线:

如果您要设置 + 使用回发 URL 功能,则不要尝试隐藏代码或事件,因为该目的和使用假定按钮单击将导航到新页面。任何其他用途,甚至尝试将回发网址设置到您所在的当前页面都是没有意义的,在这种情况下,为该按钮设置按钮事件代码子也没有任何意义。

如果您希望该按钮有一个简单的点击事件,请删除该按钮的回发网址设置。在单击按钮的情况下,您不需要也不希望在您拥有的给定网页中运行代码。

【讨论】:

亲爱的@Albert D. Kallal,在最简单的情况下,您的回答很棒。但在我的情况下,我有这个特殊的表单标签
并且这个站点使用普通的 IIS 扩展 - URL Rewriter有很多不同的规则网络配置。所以,这就是我使用 PostBackURL 的原因。我等待回发的页面名称是 PositionForm.aspx,我在 Button 参数中简单地设置了这个 URL。
如前所述,如果您要为该按钮创建一个按钮存根,则将回发 URL 移动到后面的代码并运行代码,然后在其中执行 Response.Redirect()后面的代码。我只能说为那个按钮同时拥有一个回发 URL 和代码是没有意义的。如果您需要该按钮单击以跳转到新页面,并且还需要编码,那么如上所述,删除回发 URL,并将导航跳转到该按钮后面的代码中。即使使用您的 url 重写规则,Response.Redirect 也应该可以工作。因此,对于回发网址,也没有真正的案例。 亲爱的@Albert D. Kallal,在这种情况下没有任何反应。你能看到我的项目吗?这是普通的 ASP.NET Classic 站点。如果是,我可以给你我的 AnyDesk id。我们只讨论按钮的回发。 嗯,你可以试试 OnClientClick="return false"。我可能会错过阅读这个问题。 (问题既是事件存根+回发网址)。我假设您不希望在当前页面返回帖子?回发网址应重定向到其他页面。但是,如前所述,您仍然可以为该按钮使用代码隐藏事件并放弃使用回发网址。 我需要回发 URL 但没有。而且,当然,您对使用 IIS Express 的重定向是不正确的。 IIS express 不等于带有重定向扩展的 IIS。

以上是关于ASP.NET Classic 不使用 WebForm_PostBackOptions 的默认选项创建按钮回发的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个 Visual Studio 解决方案中设置 ASP Classic 和 ASP.NET WebForm - 用于在 ASP.NET WebForm 中重写 ASP Classic 页面

为 ASP Classic 中的 COM 可见性注册 .NET DLL

如何在 ASP.NET Core 中使用 SqlClient?

Paypal 支付方式 asp.net

什么是 ASP.NET / PHP 的主流 Java 替代品

IIS应用程序池添加ASP.NET v4.0