为什么我的ASP.NET页面会注入WebResource.axd Javascript文件?

6
当我在ASP.NET页面上查看源代码时,我会得到以下片段:
<script type="text/javascript"> 
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script> 

<script src="/WebResource.axd?d=5lheyan7fritNTjDRpG8vA2&amp;t=633734967316503584" type="text/javascript"></script> 

.aspx文件看起来有点像这样:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="NaturalDateDemo._Default" %>

<form id="form1" runat="server" enableviewstate="False">
   Enter something to parse:<br />
   <asp:TextBox ID="TextBox1" runat="server" Width="270px"></asp:TextBox>
   <asp:Button ID="Button1" runat="server" Text="Parse" PostBackUrl="Default.aspx" CausesValidation="False" EnableViewState="False" UseSubmitBehavior="true" />
</form>

这两个代码块(文字代码和/WebResource.axd中的内容)似乎与使用JavaScript进行后台提交相关,我想不到任何理由需要在我的页面上使用JavaScript进行后台提交。
  • 这是做什么的?
  • 它来自哪里?
  • 可以摆脱它吗?
  • 如何摆脱它?

此问题来源的页面


一些谷歌搜索发现这个表明会导致此问题的验证控件,但我不认为我有任何验证控件。

详细查看WebResource.axd文件显示了很多看起来像是样板函数的内容,但我找不到任何引用它们的地方。


经过进一步调查,似乎我的提交按钮没有按照我想象的那样工作,因为它在其onclick处理程序中包含一些JavaScript。然而,使用FireBug,我可以看到页面正在进行完全刷新(HTTP响应具有完整的页面文本),所以我不知道那是什么。另一方面,我现在看到了一个__EVENTVALIDATION参数,它不应该存在(因为没有什么需要验证),所以这可能是值得研究的。


根据下面的回答者的答案,我遇到的问题似乎是ASP.NET执行后台提交的默认(唯一?)方式是通过JavaScript,即使基本的HTML表单也可以很好地完成。(个人认为这是微软愚蠢的设计选择;ASP.NET不应该引入JavaScript依赖性,直到您要求它执行无法在没有它的情况下完成的任务。)

基于这个观点,有几个人推测我不知道自己在说什么。(我承认我混淆了问题,误用了“后台提交”的术语,认为它仅涉及基于JS的内容。)虽然我不知道ASP.NET的实现细节,但我确实知道HTTP POST的一般工作原理,我的观点是基于考虑如何实现解决方案而不仅仅是基于我希望它如何工作。


1
在您的浏览器中查看该网页资源的URL,您应该能够弄清楚它的功能。 - David
@David 如我之前所说,这似乎与后台有关。 - BCS
我正在等待一个确切的答案。我打赌JS是为了传授来自Page类的默认asp.net行为。WebResource.axd将用于嵌入式资源。你能摆脱它吗?好吧,我认为如果你的页面没有继承默认页面类...不过我不确定。 - Perpetualcoder
在这里找到了关于 __doPostBack 的信息:http://aspalliance.com/895_Understanding_the_JavaScript___doPostBack_Function.all - Perpetualcoder
大多数答案似乎都做出了各种假设。错误的假设。您可以通过从“Button”中删除“PostBackUrl”属性来完全删除脚本。有关更多详细信息,请参见我的答案。 - Ruben
错误的假设是所有问题的根源(包括过早的优化)。往往情况下,一旦有人指出我不自觉地做出了错误的假设,我就能够独立解决我的问题。 - BCS
5个回答

13
答案比我在这里看到的任何答案都要简单得多:只需从Button中删除PostBackUrl,所有JavaScript就会像魔术一样消失。
没有JavaScript,HTML按钮无法提交到除< form action="...">指定的页面之外的其他页面。但是,如果在Button上指定了PostBackUrl,则ASP.NET提供了一种开箱即用的方法来实现这一点。这就是JavaScript的作用:支持非默认后退。
在这种特定情况下,您的PostBackUrl与
的action相同,但显然ASP.NET不会特别处理这个问题,任何非空字符串都会触发此包装器脚本。

啊!BCS,你终于发布了你的aspx代码!世界上所有的一切都变得合理了!很高兴你得到了答案 :) - phairoh
1
“你猜你是对的?”你是指在评论中多次称呼微软为愚蠢的回答后,对你的问题进行了调用吗? - Jason
答案一直都在那里。如果你在他进行更改之前跟随他的“此问题来源页面”的链接,你就可以看到“_PREVIOUSPAGE”隐藏字段。我还做出了错误的假设,认为他的意图是进行跨页发布。当使用asp .net按钮控件“PostBackUrl”添加javascript Web资源文件时,这是不可避免的。一旦aspx代码被发布,就变得清楚了,他的意图并不是跨页发布,因为这个属性的值与调用页面相同。 - Phaedrus
@Jason:我说的是:如果无法做到我所要求的事情,那么微软就做了一些愚蠢的事情。正如Ruben所展示的,我可以做到我所要求的事情,所以结论不成立。(而且我一开始就说过“我不认为微软会那么愚蠢”,至少这一点我说对了) - BCS

3

需要检查以下4个方面:

  1. 页面上是否使用了UpdatePanel?
  2. 代码中是否有任何调用后端web方法的javascript代码?
  3. 主页中是否有任何可能增加输出的内容?
  4. 是否引用了来自外部库的控件?

一旦你调查过这些,你就可以至少排除一些问题来源。

你能提供ASPX代码的任何样本吗?

编辑:你的帖子现在包含了源页面的链接。该页面在表单上有一个回发按钮,它呈现解析结果而不进行完全回发(注意整个屏幕没有重新加载)。你路径中的webresource URL包含用于完成此操作的javascript函数。你的代码正在执行部分回发,这就是为什么你的页面上有与回发相关的代码的原因。

编辑#2:要完全从系统中删除回发,您需要删除当前应用程序正在使用的.NET表单提交。您的按钮正在回发,因此它需要代码来执行此回发到您的服务器。如果您想删除它,您需要使用老式HTML直接发布到另一个URL。您将需要一个标准的POST表单,其中包含一个操作URL和表单输入字段。然而,在那时,您有点打败了使用.NET及其回发支持的目的。我猜最后一个问题是为什么您需要删除这个javascript?


  1. 解决方案中不存在 UpdatePanel 文本。
  2. 我没有任何 Web 方法。
  3. 像什么?
  4. 除了我基于标准的 ASP.NET 控件构建的自定义控件外,这都是标准的 ASP.NET。
- BCS
回复:3)它可能是菜单的导航按钮,也可能是来自库的弹出式日历控件。任何支持代码后端事件处理程序的单击操作都可能导致此问题,包括使用标准的.NET LinkButton。 - Jay S
2
微软没有犯大错误,这就是Postback的含义。当你点击按钮并请求服务器执行某项操作并刷新屏幕以获取信息时,就会发生Postback。你将问题发送回服务器(因此称为Post-back),然后它会给你提供结果。有多种实现方式,但你选择了显式执行Postback的方式。 - Jay S
1
这显然是错误的,看看我的答案。ASP.NET不需要这个脚本,实际上(隐式地)要求提供这个脚本。只需查看按钮上的PostBackUrl即可找到原因。 - Ruben
1
我承认错误。在没有看到ASPX标记的情况下,我对你的回发按钮做出了错误的假设。向Ruben致敬。 - Jay S
显示剩余10条评论

1
这就是.NET回发的工作原理,也是为什么很多人正在转向.NET MVC模型的原因。为了使回发正常工作,.NET实际上依赖于JavaScript来完成大部分繁琐的工作。唯一能真正摆脱它的方法就是采用MVC模型。

你在开玩笑吧?我不知道微软会那么愚蠢。如果是真的,那么微软从一个简单的解决方案转向了一个复杂的解决方案,而且系统的功能完全没有增加。 - BCS
7
这并不是“微软太傻了”的问题,而是你选择使用的技术。显然,你没有花时间去了解什么是.NET,它为什么会使用postbacks(后台提交),或者postback是什么意思。 - Jay S
实际上它运行得非常好。只需最少量的注入,您就可以获得大量额外的功能。这也是为什么.NET会破坏您的控件ID。它有一种约定用于查找页面上的元素。 - Jason
@Jason:我所说的“它”,是指JS提供的功能,而不是ASP.NET。 - BCS
这是明显的错误,请看我的回答。ASP.NET不需要这个脚本,实际上它(隐式地)要求提供此脚本。 - Ruben
显示剩余3条评论

0
从您的页面上看,我不明白为什么您“想不出任何理由需要后台提交(post-backs)”。对我来说很清楚,当单击解析(Parse)按钮时,您正在调用服务器上的一些方法来解释传入的值并将其转换为日期,然后将该日期返回到浏览器,以便用户可以看到它。
我猜您最初并没有创建这个页面,并且对ASP.Net的经验很少?这并不是因为“微软大错特错”(正如您在Jay S非常出色的答案评论中提到的那样,他可能值得一个勾选标记),而是因为您的需求似乎已经改变,现在您需要确保在禁用JavaScript时页面能够正常工作,这在ASP.Net中是可能实现的,只是不是ASP.Net自然的方式。但是,这可能需要对页面进行相当大的改动,因为对需求的大幅度更改通常都是如此。

s/post-back/基于JS的post-back/ 似乎我对人们所谓的“post-backs”的理解有点狭隘。顺便说一下,整个页面和后备库都是我写的。虽然这是我的第一个ASP页面。我认为微软搞砸的地方正是现在需要在没有JavaScript的情况下工作的简单数据提交页面的更改“需要进行相当大的改进”。(如果他们不认为这是一个小变化,那就是另一个问题) - BCS
但这并不是一个小改变,因为那是你选择实现它的方式。我同意Jay S的观点,并认为你应该花更多时间去了解这项技术。在ASP.Net世界中,有许多选项可供选择,一旦你学会如何做事情,它就非常强大。 - phairoh
1
@Phairoh:我选择按照微软推荐的方式构建页面。我仍然认为,即使在不给用户任何东西的情况下,微软推荐一种不能不使用JS的解决方案是错误的。在某种程度上,即使他们构建这样的解决方案也是一个错误。 - BCS

0

如果您正在使用继承另一个类的控件,则传递的类型必须是父类的类型,而不是基类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接