当我在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&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 才能进行回发。
The page this question is coming from
Google的一项小工作发现this表示验证控件会导致此问题,但我认为我没有任何验证控件。
详细查看WebResource.axd
文件显示了许多看起来像锅炉板功能的内容,我无法从任何地方找到任何引用。
经过进一步调查后,似乎我的提交按钮没有按我认为的那样做,因为它的onclick
处理程序中有一些JavaScript。但是,使用FireBug我可以看到页面正在进行完全刷新(HTTP响应具有完整的页面文本),所以我不知道那是什么。 OTOH我现在看到一个__EVENTVALIDATION
参数不应该存在(因为没有什么可以验证的)所以查找起来可能很有意思。
似乎基于下面的回答者,我遇到的是,即使基本HTML表单可以正常运行,ASP.NET进行回发的默认(仅限?)方式也是通过JavaScript进行的。 (就我个人而言,我认为这是MS部分的一个愚蠢的设计选择;在你要求它做一些没有它的情况下无法完成的事情之前,ASP.NET不应该引入JavaScript依赖。)
基于这种观点,有几个人推测我不知道我在说什么。 (我会因为使用术语“post-back”而错过这个问题,认为它只暗示基于JS的东西。)虽然我不知道ASP.NET的实现细节,但我知道一般的HTTP如何POST的东西是有效的,我的意见是基于考虑如何实现我自己的解决方案,而不仅仅是基于我希望它如何工作。
答案 0 :(得分:13)
答案比我在这里看到的要简单得多:只需从PostBackUrl
中删除Button
,所有JavaScript都会像魔法一样消失。
如果没有JavaScript,HTML按钮无法提交到<form action="...">
中指定的页面以外的其他页面。但是,如果在PostBackUrl
上指定Button
,ASP.NET确实提供了开箱即用的可能性。这就是JavaScript的意义:支持非默认的回发。
在这种特定情况下,您的PostBackUrl
与<form>
的{{1}}相同,但显然ASP.NET不特殊情况,任何非空字符串都会触发此包装脚本。
答案 1 :(得分:3)
要检查的4件事:
一旦你对此进行了调查,你或许可以至少删除一些关于问题根源的选项。
您可以在ASPX上提供任何代码示例吗?
编辑:您的帖子现在包含指向源页面的链接。该页面在表单上有一个回发按钮,它可以在不进行完整回发的情况下呈现解析结果(请注意整个屏幕不会重新加载)。路径中的webresource URL包含用于完成此操作的javascript函数。您的代码正在进行部分回发,这就是您在页面上有与回发相关的代码的原因。
编辑#2:要从系统中完全删除回发,您需要删除应用程序当前正在使用的.NET表单提交。您的按钮正在回发,因此需要代码才能执行此回发到您的服务器。如果你想删除它,你需要将旧学HTML直接发布到另一个URL。您将需要一个带有操作URL和表单输入字段的标准POST表单。但是,在这一点上,你有点打败了使用.NET及其回发支持的目的。我想最后一个问题是为什么你需要删除这个javascript?
答案 2 :(得分:1)
这就是.NET回发的工作方式,以及为什么很多人都在移动.NET MVC模型。为了使回发正常工作,.NET实际上依赖于javascript来完成大量的脏工作。你可以真正摆脱它的唯一方法是使用MVC模型。
答案 3 :(得分:0)
从查看您的页面,我不明白您如何“无法想到[您的]页面需要回复的任何理由。”我很清楚,当你点击你的Parse按钮时,你正在调用服务器上的一些方法来解释传入的值并将其转换为日期,然后将该日期返回给浏览器,以便用户可以看到它。
我是否正确地假设您最初没有创建此页面并且几乎没有使用ASP.Net的经验?这不是“MS搞砸了大时间”(正如你在评论Jay S的答案中所提到的那样,可能值得一个复选标记)这就是你的要求似乎已经改变了,现在你需要确保页面工作时禁用JavaScript,这可能与ASP.Net有关,这不是ASP.Net做事的自然方式。然而,这可能需要对页面进行相当大的改革,因为对需求的大多数改变都会发生。
答案 4 :(得分:0)
如果您使用的是继承另一个类的控件,则传递的类型必须是父类的类型,而不是基类