5

当我在我的 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 响应具有完整的页面文本)所以我不知道那是什么。OTOH,我现在看到一个__EVENTVALIDATION不应该存在的论点(因为没有什么可验证的),因此查找起来可能很有趣。


似乎基于下面的回答者,我遇到的是 ASP.NET 执行回发的默认(唯一?)方式是通过 JavaScript,即使基本的 HTML 表单就可以了。(我个人认为这在 MS 部分是一个愚蠢的设计选择;ASP.NET 不应该引入 JavaScript 依赖项,除非你要求它做一些没有它就无法完成的事情。)

基于这种观点,一些人猜测我不知道我在说什么。(我承认我错过了使用术语“post-back”来混淆这个问题,认为它只暗示基于 JS 的东西。)虽然我不知道 ASP.NET 的实现细节,但我知道一般的 HTTP POST 的东西是有效的,我的意见是基于考虑我将如何实现我自己的解决方案,而不仅仅是基于我希望它如何工作。

4

5 回答 5

13

答案比我在这里看到的要简单得多:只需PostBackUrl从 中删除Button,所有 JavaScript 就会像魔术一样消失。

如果没有 JavaScript,HTML 按钮无法提交到<form action="...">. 但是,如果您PostBackUrlButton. 这就是 JavaScript 的意义所在:支持非默认回发。

在这种特定情况下, yourPostBackUrl<form>'s相同action,但显然 ASP.NET 不会对此进行特殊处理,并且任何非空字符串都会触发此包装脚本。

于 2009-08-10T20:55:08.407 回答
3

要检查的 4 件事:

  1. 您是否在页面的某处使用了 UpdatePanel?
  2. 您的代码中是否有任何 javascript 调用 Web 方法?
  3. 您的母版页中是否有任何内容可能会添加到您的输出中?
  4. 您是否引用外部库中的任何控件?

一旦你对此进行了调查,你至少可以删除一些关于问题根源的选项。

你能提供你的 ASPX 上的任何代码示例吗?

编辑: 您的帖子现在包含指向源页面的链接。该页面在表单上有一个回发按钮,该按钮无需执行完整回发即可呈现解析结果(请注意,整个屏幕不会重新加载)。路径中的 webresource URL 包含用于完成此操作的 javascript 函数。您的代码正在执行部分回发,这就是您的页面上有回发相关代码的原因。

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

于 2009-08-10T18:38:45.360 回答
1

这就是 .NET 回发的工作方式,也是很多人迁移 .NET MVC 模型的原因。为了使回发能够正常工作,.NET 实际上依赖于 javascript 来完成许多繁琐的工作。真正摆脱它的唯一方法是使用 MVC 模型。

于 2009-08-10T19:17:27.357 回答
0

通过查看您的页面,我不明白您如何“想不出[您的]页面需要回发的任何原因”。我很清楚,当单击 Parse 按钮​​时,您正在调用服务器上的一些方法来解释传入的值并将其转换为日期,然后将该日期返回给浏览器以便用户可以看到它。

我是否正确地假设您最初并未创建此页面并且对 ASP.Net 几乎没有经验?并不是说“MS 搞砸了”(正如您在评论中提到 Jay S 的非常出色的答案可能值得打勾),而是您的要求似乎已经改变,现在您需要确保页面在JavaScript 被禁用,这可以用 ASP.Net 来做,这不是 ASP.Net 做事的自然方式。然而,这可能需要对页面进行相当大的检修,因为对需求的大多数剧烈变化都是如此。

于 2009-08-10T19:29:52.603 回答
0

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

于 2009-10-19T14:14:18.287 回答