Почему IsPostBack требует в форме runat = server?

Я не должен понимать чего-то фундаментального о цикле обработки aspx-страницы. Взгляните на этот простой пример ниже.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <title></title>
</head>

<body>
    <div>
        <form method="post">
            <textarea name="someContent" cols="35" rows="15"></textarea>
            <input type="submit"/>
        </form>
    </div>
</body>
</html>



<script runat="server">
    public void Page_Load() {
        // The httpMethod is always set correctly to "GET" or "POST" 
        String httpMethod =  HttpContext.Current.Request.HttpMethod;

        if(IsPostBack)
            DoSomething();
        else
            DoSomethingElse();  
    } 
</script>

Обратите внимание, что у элемента ‹form› нет атрибута runat = 'server'.

Когда страница загружается в первый раз, запускается Page_Load (), а для переменной httpMethod устанавливается значение «GET», а свойство IsPostback возвращает false, как и ожидалось.

Когда пользователь нажимает кнопку «отправить», снова запускается Page_Load (), а для переменной httpMethod устанавливается значение «POST», поэтому система ASP.NET, очевидно, знает, что это команда POST; однако свойство IsPostBack по-прежнему возвращает false. Мне это кажется странным. Я бы подумал, что если для httpMethod установлено значение «POST», IsPostBack вернет true.

Если я изменю элемент ‹form›, чтобы он содержал атрибут runat = 'server', все немного изменится. Теперь, когда пользователь нажимает кнопку «отправить», для переменной httpMethod устанавливается значение «POST», как и раньше, но теперь IsPostBack возвращает true.

Поскольку мне не нужно обращаться к элементу ‹form› на сервере, я не видел необходимости использовать на нем атрибут runat = 'server'. Но по какой-то причине runat = 'server' должен присутствовать в ‹form›, чтобы IsPostBack возвращал правильное значение, даже если свойство HttpContext.Current.Request.HttpMethod возвращает правильное значение независимо от runat = Атрибут server.

Может ли кто-нибудь объяснить, ПОЧЕМУ для правильной работы IsPostBack необходим runat = 'server' на ‹form›?

ПРИМЕЧАНИЕ. Обратите внимание, что я не спрашиваю, как «сделать то» или «сделать то». Моя цель - понять «Почему».

Спасибо


person Tom Baxter    schedule 26.09.2014    source источник


Ответы (1)


Страница проверяет несколько специальных полей (состояние просмотра и событие обратной передачи), чтобы определить, является ли запрос обратной передачей или нет.
http://referencesource.microsoft.com/System.Web/R/ae07c23d0aba6bb9.html

Обе формы здесь приводят к тому, что IsPostBack будет истинным:

<%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
    <body>

        <p><%= IsPostBack? "POSTBACK" : "NO POSTBACK" %></p>

        <form id="form1" runat="server">
            <input type="submit" />
        </form>

        <form id="form2" method="get">
            <input type="hidden" name="__EVENTTARGET" value="" />
            <input type="submit" />
        </form>

    </body>
</html>

Форма, управляемая сервером, просто добавляет и заполняет эти поля автоматически.

person Leonid    schedule 26.09.2014