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("ctl00$MainContent$btnQuestion", "", false, "", "../../PositionForm.aspx", 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 的内置表单输入验证 - 它使用客户端逻辑将您的表单验证为无效,但您的表单没有任何地方可以显示验证错误消息。你有<asp:ValidationSummary>
元素吗?浏览器控制台中是否显示任何内容?
根据我的经验,我发现许多 WebForm 对 古老、有缺陷、不安全等 版本的 jQuery 有硬编码的依赖关系,这些版本很容易破坏 - 所以这是需要考虑的一件事。
另外,您的.browser
文件是最新的吗?你在使用 ASP.NET AJAX 和 所以,我最终解决了这个问题。这不是儿童网站或演示网站,这是真正的 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,在最简单的情况下,您的回答很棒。但在我的情况下,我有这个特殊的表单标签 如前所述,如果您要为该按钮创建一个按钮存根,则将回发 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?