Почему моя страница ASP.NET внедряет этот файл WebResource.axd Javascript? - PullRequest
5 голосов
/ 10 августа 2009

При просмотре источника на странице 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 для выполнения постбэков.

  • Что это делает?
  • Откуда это?
  • Может ли избавиться от этого?
  • Как можно от него избавиться?

Страница, с которой идет этот вопрос


Небольшая работа Google нашла это , указывающее, что элементы проверки могли бы вызвать это, но я не думаю, что у меня есть какие-либо элементы проверки.

Детальное рассмотрение файла WebResource.axd показывает многое из того, что выглядит как функция котельной плиты, на которую я нигде не могу найти никаких ссылок.


После дальнейшего исследования кажется, что моя кнопка отправки не выполняет то, что я думал, потому что в обработчике onclick есть некоторый JavaScript. Однако, используя FireBug, я вижу, что страница полностью обновляется (ответ HTTP содержит полный текст страницы), поэтому я понятия не имею, о чем идет речь. OTOH Теперь я вижу аргумент __EVENTVALIDATION, которого не должно быть (потому что проверять нечего), так что это может быть интересно посмотреть.


Кажется, основываясь на ответе ниже, что я сталкиваюсь с тем, что ASP.NET по умолчанию (только?) Делает постбэк с помощью JavaScript, даже если базовая форма HTML будет работать нормально. (Лично я считаю, что это глупый выбор дизайна для MS-части; ASP.NET не должен вводить зависимость JavaScript, пока вы не попросите его сделать что-то, что невозможно без него.)

Исходя из этого мнения, несколько человек предположили, что я не знаю, о чем говорю. (Я признаю, что я путал проблему с ошибкой, используя термин «постбэк», думая, что это подразумевает только материал на основе JS.) Хотя я не знаю деталей реализации ASP.NET, я знаю, как работает общий HTTP POST работает, и мое мнение основано на рассмотрении того, как я сам реализую решение, а не на том, как бы я хотел, чтобы оно работало.

Ответы [ 5 ]

13 голосов
/ 11 августа 2009

Ответ намного проще, чем любой, который я видел здесь: просто удалите PostBackUrl из Button, и весь JavaScript исчезнет, ​​как волшебство.

Без JavaScript кнопка HTML не может перейти на страницу, отличную от страницы, указанной в <form action="...">. Тем не менее, ASP.NET предоставляет возможность сделать это "из коробки", если вы укажете PostBackUrl для Button. Вот что такое JavaScript: поддержка постбека не по умолчанию.

В этом конкретном случае ваш PostBackUrl совпадает с <form> action, но, очевидно, ASP.NET не делает этого особенным, и любая непустая строка вызывает этот скрипт-обертку.

3 голосов
/ 10 августа 2009

4 вещи для проверки:

  1. Используете ли вы UpdatePanel где-то на странице?
  2. Есть ли у вас какой-либо javascript, вызывающий веб-методы в вашем коде?
  3. Есть ли на вашей главной странице что-нибудь, что могло бы добавить к вашему выводу?
  4. Вы ссылаетесь на какие-либо элементы управления из внешней библиотеки?

После того, как вы это изучите, вы сможете, по крайней мере, исключить некоторые варианты источника проблемы.

Можете ли вы предоставить какой-либо пример кода на ASPX?

РЕДАКТИРОВАТЬ: Ваше сообщение теперь содержит ссылку на исходную страницу. На странице есть кнопка обратной отправки в форме, которая отображает результаты анализа без полной обратной отправки (обратите внимание, что весь экран не перезагружается). URL веб-ресурса в вашем пути содержит функции javascript, используемые для этого. Ваш код выполняет частичную обратную передачу, поэтому на вашей странице есть код, связанный с обратной передачей.

РЕДАКТИРОВАТЬ # 2: Чтобы полностью удалить постбэки из системы, вам необходимо удалить отправку формы .NET, которая в данный момент используется вашим приложением. Ваша кнопка отправляет сообщение назад, поэтому для выполнения этой отправки на ваш сервер необходим код. Если вы хотите удалить это, вы должны сделать что-то с отправкой HTML старой школы прямо на другой URL. Вам понадобится стандартная форма POST с URL-адресом действия и полями ввода формы. Однако в этот момент вы как бы побеждаете цель использования .NET и его поддержки обратной передачи. Я думаю, последний вопрос: зачем вам удалять этот javascript?

1 голос
/ 10 августа 2009

Вот как работают обратные передачи .NET и почему многие люди перемещают модель .NET MVC. Для правильной работы постбэков .NET на самом деле полагается на javascript, который выполняет большую часть грязной работы Единственный способ избавиться от него - это использовать модель MVC.

0 голосов
/ 19 октября 2009

Если вы используете элемент управления, который наследует другой класс, передаваемый тип должен быть типом родительского, а не базового класса

0 голосов
/ 10 августа 2009

Глядя на вашу страницу, я не понимаю, как вы «не можете придумать ни одной причины, по которой [ваша] страница потребует постбэков». Мне совершенно ясно, что при нажатии на кнопку Parse вы вызываете некоторые методы на сервере, чтобы интерпретировать переданное значение и преобразовать его в дату, а затем вернуть эту дату в браузер, чтобы пользователь мог ее увидеть.

Правильно ли я полагаю, что вы изначально не создавали эту страницу и не имели большого опыта работы с ASP.Net? Дело не в том, что «MS облажался» (как вы упомянули в своем комментарии к очень хорошо сделанному ответу Джея С., который, вероятно, заслуживает галочки), это в том, что ваши требования изменились, и теперь вы должны убедиться, что страница работает JavaScript отключен, что возможно сделать с ASP.Net, просто ASP.Net не делает этого. Однако это, вероятно, потребует довольно серьезного пересмотра страницы, как это делают большинство радикальных изменений в требованиях.

...