Почему моя страница ASP.NET внедряет этот файл Javascript WebResource.axd?

Когда я просматриваю исходный код на своей странице 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 работает, и мое мнение основано на рассмотрении того, как я буду реализовывать решение самостоятельно, а не только на том, как я хотел бы, чтобы оно работало.


person BCS    schedule 10.08.2009    source источник
comment
Просмотрите этот URL-адрес веб-ресурса в своем браузере, и вы сможете понять, что он делает.   -  person David    schedule 10.08.2009
comment
@David Как я уже сказал; это, кажется, имеет какое-то отношение к постам.   -  person BCS    schedule 10.08.2009
comment
Жду точного ответа на это. Я ставлю на то, что JS должен передать поведение asp.net по умолчанию, которое исходит от класса Page. WebResource.axd предназначен для встроенных ресурсов. Вы можете избавиться от него? хорошо, я думаю, что если ваша страница не наследуется от класса страницы по умолчанию ... не уверен, хотя   -  person Perpetualcoder    schedule 10.08.2009
comment
Нашел это для __doPostBack aspalliance.com/   -  person Perpetualcoder    schedule 10.08.2009
comment
Большинство ответов, кажется, делают всевозможные предположения. Неправильные. Вы можете полностью удалить скрипт, удалив атрибут PostBackUrl из файла Button. Смотрите мой ответ для более подробной информации.   -  person Ruben    schedule 11.08.2009
comment
Неверное предположение — корень всех зол (включая преждевременную оптимизацию). Очень часто, как только кто-то указывает на неправильное предположение, которое я делаю, даже не осознавая этого, я могу решить свою проблему самостоятельно.   -  person BCS    schedule 11.08.2009


Ответы (5)


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

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

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

person Ruben    schedule 10.08.2009
comment
Ах! BCS, вы наконец опубликовали свой код aspx! Все имеет смысл с миром! Рад, что вы получили ответ :) - person phairoh; 11.08.2009
comment
[ты] догадываешься, [ты] был прав? вы имеете в виду после того, как назвали MS глупым, как 23850235 раз в ваших комментариях к ответам на ваш вопрос? - person Jason; 11.08.2009
comment
Ответ был там все время. Если вы перешли по его ссылке «Страница, с которой исходит этот вопрос» (до того, как он внес изменения), вы могли увидеть скрытое поле «_PREVIOUSPAGE». Я также сделал неверное предположение, поскольку я думал, что его намерением БЫЛО сделать кросс-страничный пост. Что при использовании кнопки asp .net управления «PostBackUrl» добавление файла веб-ресурса javascript неизбежно. Как только код aspx был опубликован, стало ясно, что его намерение НЕ было публикацией на нескольких страницах, поскольку значение этого свойства было таким же, как и у вызывающей страницы. - person Phaedrus; 11.08.2009
comment
@Jason: Я сказал следующее: если было невозможно сделать то, о чем я просил, тогда MS сделала что-то глупое. Как показал Рубен, я могу сделать то, о чем просил, поэтому вывод неверен. (И я начал с таких вещей, как я не думаю, что MS такая глупая и, по крайней мере, я правильно понял) - person BCS; 11.08.2009

4 вещи, которые нужно проверить:

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

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

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

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

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

person Jay S    schedule 10.08.2009
comment
1) текст UpdatePanel не существует в решении. 2) У меня вообще нет веб-методов. 3) Нравится что? 4) все стандартно для ASP.NET, за исключением пользовательского элемента управления, который я создал на основе стандартного элемента управления ASP.NET. - person BCS; 10.08.2009
comment
Re: 3) Это может быть кнопка навигации для меню или элемент всплывающего календаря из библиотеки. Все, на что вы нажимаете, что поддерживает обработчики событий codebehind, может вызвать это, включая использование стандартного .NET LinkButton - person Jay S; 10.08.2009
comment
Кроме того, ссылается ли ваш код на какие-либо скомпилированные библиотеки DLL в папке BIN? - person Jay S; 10.08.2009
comment
Он ссылается на другой проект, но этот проект даже не знает, что находится на странице ASP.NET. - person BCS; 10.08.2009
comment
Можете ли вы предоставить полный сгенерированный HTML? Говорит ли ссылка __doPostback, когда вы наводите на нее курсор? Есть ли ссылки на __doPostback где-либо в исходном коде (кроме самого метода)? - person Jay S; 10.08.2009
comment
Кроме того, есть ли у вас ссылки на сборку: WebResource в ваших файлах AssemblyInfo? Это может быть загрузка внешних ресурсов. - person Jay S; 10.08.2009
comment
Я перешел по предоставленной вами ссылке, и у вас явно есть обратные передачи, происходящие с вашей формой. Я отредактировал свой ответ, чтобы отразить это. - person Jay S; 10.08.2009
comment
Отображенный HTML-код находится здесь: smplsite.com/NaturalDate/Default.aspx Я обнаружил, что кнопка отправки имеет обработчик onclick, который ссылается на этот материал... - person BCS; 10.08.2009
comment
Как мне избавиться от этого? Я хочу полную перезагрузку, если это поможет избавиться от JS. - person BCS; 10.08.2009
comment
Я обновил свой ответ. По сути, если вам не нужен код обратной передачи, вы не можете использовать обратную передачу. - person Jay S; 10.08.2009
comment
Мне нужно выбросить JS, потому что я видел, что страница не работает с отключенным JS. Что касается необходимости переделывать страницу, чтобы потерять это; если это действительно так, то MS напортачила большое время (и мне трудно поверить, что они настолько глупы), поскольку здесь нет ничего, что действительно нуждалось бы в постбэках. Для ASP.NET должно быть тривиально отображать то, что у меня есть прямо сейчас, как страницу на основе HTML-форм старой школы, просто не выводя JS и onclick. - person BCS; 10.08.2009
comment
MS не сильно облажалась, это и есть постбэк. Это когда вы нажимаете кнопку и просите сервер что-то сделать и обновляете экран информацией. Вы отправляете вопрос обратно на сервер (отсюда: Post-back). Затем он предоставляет вам результаты. Существует несколько способов реализации вещей, но вы решили сделать это таким образом, чтобы явным образом выполнялись обратные передачи. - person Jay S; 10.08.2009
comment
Если вы звоните не-JS, отправка на основе HTML-форм является типом обратной связи, то то, что я сказал, может быть неправильным. Однако я имел в виду только постбэки на основе JS; если материал ASP.NET по умолчанию только работает через обратные передачи на основе JS, тогда мне придется отстаивать свое утверждение о том, что они облажались, потому что, как вы указываете, это только один из нескольких способов сделать это и не самый надежный. - person BCS; 10.08.2009
comment
Это явно неправильно, смотрите мой ответ. ASP.NET не требует этого сценария, его фактически (неявно) попросили предоставить этот сценарий. Просто посмотрите на PostBackUrl на кнопке. Это причина. - person Ruben; 11.08.2009
comment
Я исправляюсь. Не видя разметки ASPX, я сделал неверное предположение о вашей кнопке обратной передачи. Совет Рубену. - person Jay S; 11.08.2009

Именно так работают обратные передачи .NET и почему многие люди переходят на модель .NET MVC. Чтобы обратные передачи работали правильно, .NET фактически полагается на javascript, который выполняет большую часть грязной работы. Единственный способ, которым вы действительно можете избавиться от этого, — это использовать модель MVC.

person Jason    schedule 10.08.2009
comment
Ты шутишь? Я не знал, что MS был настолько глуп. Если это правда, то MS перешла от простого решения, которое работает везде, к сложному решению, которое не работает, и получила ровно НУЛЕВОЕ увеличение возможностей системы. - person BCS; 10.08.2009
comment
Это не MS быть глупым. Это технология, которую вы выбрали для использования. Вы, очевидно, не потратили время на то, чтобы узнать, что такое .NET, или почему он использует обратные передачи, или что такое обратные передачи. - person Jay S; 10.08.2009
comment
на самом деле это работает очень хорошо. с минимальным количеством инъекций вы получаете массу дополнительных функций. именно поэтому .NET искажает ваши идентификаторы элементов управления. у него есть соглашение, которое он использует для поиска элементов на странице. - person Jason; 10.08.2009
comment
@Jason: Это может дать вам массу дополнительных функций, когда вы решите их использовать. С другой стороны, у меня нет причин использовать его, поэтому он ничего не дает мне. Какую дозу она мне купит? У меня нет логики проверки. Я не занимаюсь обработкой на стороне сервера, за исключением для отправки, и формы прекрасно справятся с этим. - person BCS; 11.08.2009
comment
если вам это не нравится, не используйте его! иди МВК. ты не заденешь мои чувства. - person Jason; 11.08.2009
comment
@Jason: я говорил о функциональности, которую дает JS, это была не ASP.NET - person BCS; 11.08.2009
comment
Это явно неправильно, см. мой ответ. ASP.NET не требует этого скрипта, его фактически (неявно) попросили предоставить этот скрипт. - person Ruben; 11.08.2009
comment
ха, ну, чувак наконец-то запостил свой HTML... если бы он запостил это в первую очередь, я мог бы сразу же сказать ему, чтобы он избавился от него. вам не нужно указывать это при создании кнопки. - person Jason; 11.08.2009

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

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

person phairoh    schedule 10.08.2009
comment
s/post-back/JS based post-back/ Кажется, мое понимание того, что люди называют постбэками, было слишком узким. -- Кстати, я написал всю страницу и вспомогательную библиотеку. Это это моя первая мысль на ASP-странице. -- Где я думаю, что ошибка MS заключается именно в том, что незначительное изменение простой страницы отправки данных, которая теперь должна работать без JavaScript, требует довольно серьезного пересмотра. (и если они не считают это незначительным изменением, это еще одна проблема) - person BCS; 10.08.2009
comment
Но это не незначительное изменение, потому что именно так вы решили его реализовать. Я согласен с Jay S и думаю, что вам нужно немного больше времени, чтобы понять технологию. Есть много вариантов, которые вы можете использовать, и они очень эффективны, когда вы научитесь делать что-то в мире ASP.Net. - person phairoh; 11.08.2009
comment
@Phairoh: я решил создать страницу так, как рекомендует MS. Я все еще думаю, что со стороны MS было бы ошибкой рекомендовать решение, которое не может не использовать JS, даже если оно ничего не дает пользователю. И в меньшей степени для них было бы ошибкой даже построить такое решение. - person BCS; 11.08.2009

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

person rodolfo    schedule 19.10.2009