Подтвердить что ты не робот

Элементы формы в основных страницах ASP.NET и страницах содержимого

ОК, еще один дорожный удар в моем текущем проекте.

У меня никогда не было элементов формы в обеих моих главных и контентных страницах, я, как правило, имею все формы в соответствующем содержании.

Однако в текущем проекте у нас есть страница, где они хотят обоим. Форма входа в верхнем правом углу и форма вопросов в содержании.

Попробовав это сделать, я столкнулся с проблемой стону ASP.NET о необходимости создания одного элемента формы на главной странице. TBH, я действительно не понимаю, почему это требование для части ASP.NET, но hey ho.

Кто-нибудь знает, если/как я могу заставить страницы мастера и контента содержать элементы формы, которые работают независимо?

Если нет, можете ли вы предложить советы о том, как перейти к желаемому виду/функциональности?

4b9b3361

Ответ 1

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

Этот был интересным. Я откровенно отказался верить, что вы можете иметь только одну форму на странице ASP.NET. Это мне не имело смысла. Я видел много веб-страниц, которые имеют более одной формы на веб-странице, почему страница ASP.NET должна быть другой?

Итак, это заставило меня задуматься.

Почему страница ASP.NET нуждается в элементе формы?

Страницы ASP.NET пытаются эмулировать среду WinForms, предоставляя состояние через модель PostBack. Это обеспечивает элемент состояния в среде без состояния. Чтобы это сделать, среда выполнения должна иметь возможность поддерживать это состояние в каждой "форме". Он делает это, отправляя обратно данные самому себе. Важно отметить, что:

  • В PostBack ничего особенного нет.
  • Он использует форму HTTP и POST, так же как любую другую форму, из любого другого стека.
  • Просто потому, что похоже, что это может быть что-то особенное, а это не так, все, что происходит, это POST назад с некоторой информацией о том, что вызвало его, поэтому вы можете делать такие вещи, как обрабатывать события на стороне клиента, в серверном коде.

Итак, почему только один?

Это для меня был миллионный вопрос (я англичанин). Я понимаю, что ASP.NET это нуждается, особенно если вы используете серверные элементы управления ASP.NET, но Почему, черт возьми, я не могу создать свои собственные дополнительные формы?

Итак, я подумал, что вы его закрутите, просто создайте свою собственную форму!

И я это сделал. Я добавил стандартную, простую форму болота с действием отправки "#". Затем он выполняет POST на текущей странице с данными формы для данной формы в запросе.

Угадайте, что? Все работало нормально. Итак, я закончил:

  • Основная страница с формой HTML в
  • Эта форма возвращается к текущей странице (в основном страница с использованием мастера).
  • В коде страницы_Load для мастера я добавил код, чтобы проверить запрос, чтобы узнать, какие данные были переданы в запросе. Если он содержит данные (скажем, скрытое поле), то я знаю, что почта была получена из формы на главной странице, а если нет, то она больше всего похожа на PostBack из содержимого и может быть проигнорирована.
  • Затем я окружил теги содержимого тегами <form runat="server" id="aspNetForm"...> </form>. Это означало, что на всех страницах контента автоматически была форма для работы.

Это обеспечило мне относительно простое, чистое решение моей проблемы. Моя форма входа работает отлично в тандеме со всеми созданными формами контента, некоторые из которых являются сложными формами, другие используют множество серверных элементов управления и много PostBacks и т.д.

Я надеюсь, что это поможет другим.

Ответ 2

сам тег формы находится в MasterPage, поэтому вы можете закодировать любые элементы управления asp.net на главной странице, которую вы хотите. И вы можете написать логику обработки для этих элементов управления сервером в файле главной страницы за файлом.

Итак, в вашем примере вы можете иметь элементы управления входами в верхнем правом углу главной страницы, а затем использовать логику аутентификации на кодовой странице для МАСТЕР-СТРАНИЦЫ, а не на своей странице содержимого.

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

Ответ 3

Все остальные уже упомянули, что на данной странице ASP.NET может быть только один элемент формы, и он будет содержаться на главной странице. Все идет нормально. Но я не думаю, что это поможет вам полностью добраться туда, где вы хотите быть...

На ваших основных страницах вы (я полагаю!) определили элементы управления asp:ContentPlaceHolder. Ваши страницы, которые используют мастер, имеют соответствующие теги asp:Content. Все содержимое вашей страницы должно находиться в соответствующих тегах asp:Content.

В этом теге они являются частью основной страницы. Главная страница может реагировать на события из собственных элементов управления, а сами страницы реагируют на события из своих собственных элементов управления, и вы настроены.

Если вам нужна страница для взаимодействия с главной страницей, вы можете получить к ней доступ через свойство Page.Master. Чтобы взаимодействовать с любым общедоступным кодом (методами, свойствами и т.д.) С главной страницы, вы должны применить это свойство к правильному типу и получить доступ к общедоступному видимому коду.

Это должно привести вас туда, где вам нужно быть в этом сценарии. (Он работал у меня на нескольких сайтах!)

Ответ 4

Rob,

Интересное решение. Я не вижу никаких проблем с тем, что вы делаете. Однако проблема может возникнуть, если они попытаются сделать это с помощью двух форм сервера. В ASP.NET нет правила, что на странице не может быть больше одной HTML-формы, просто у вас не может быть более одной формы "runat = 'server" на странице. Очевидно, вы нашли довольно простой способ удовлетворить ваши потребности.

Я обнаружил, что по большей части работа с одной формой не является проблемой, потому что структура ASP.NET в основном отделяет все для нас с помощью именования контейнеров. Но в вашем первоначальном комментарии вы попали на важный фактор, который отсутствовал, но все же критический для сути первоначального вопроса: введите ключевое поведение. Это всегда бросает в обезьяньи ключи.

Если бы вы использовали стандартную "всеохватывающую" форму сервера, не могли бы вы захватить правильное действие, используя текстовое поле, изменившее событие? Конечно, если пользователь изменил оба значения до того, как вы нажмете кнопку ввода, вы получите странное поведение. И я думаю, что основная проблема с ключом ввода заключается в том, что после того, как у вас есть несколько входных данных для формы HTML, нажатие ENTER в текстовом поле ничего не делает. Только когда есть один элемент INPUT, клавиша ввода вызывает "щелчок".

Ответ 5

Ни один из предыдущих ответов не привел пример кода. Вот упрощенная версия Visual Studio 2012 Site.Master, которая иллюстрирует, как это сделать:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site - Copy.Master.cs" Inherits="WebApplication1.Site1Master" %>
<!DOCTYPE html>
<html>
    <head runat="server">
        <title>This is a title</title>
        <asp:ContentPlaceHolder runat="server" ID="HeadContent" />
    </head>
    <body>
    <form runat="server">
    <header>
        <div class="content-wrapper">
            <div class="float-right">
                <section id="login">
                    <asp:LoginView runat="server" ViewStateMode="Disabled">
                        <AnonymousTemplate>
                             <asp:ContentPlaceHolder runat="server" ID="AnonContent" />
                        </AnonymousTemplate>
                        <LoggedInTemplate>
                            <asp:ContentPlaceHolder runat="server" ID="LoggedInContent" />
                        </LoggedInTemplate>
                    </asp:LoginView>
                </section>
            </div>
        </div>
    </header>
        <div id="body">
        <asp:ContentPlaceHolder runat="server" ID="FeaturedContent" />
        <section class="content-wrapper main-content clear-fix">
            <asp:ContentPlaceHolder runat="server" ID="MainContent" />
        </section>
    </div>
    </form>
</body>
</html>

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

Ответ 6

У вас может быть только одна форма на странице ASP.NET. Один из способов справиться с этим - разместить обработчик событий на кнопке входа на главной странице. Обработчик будет проверять пользователя и перенаправлять на ту же страницу при успешном выполнении (чтобы правильно запустить обработчик Page_Load, который запускается до обработчиков событий).

Ответ 7

Я решил, что "нажатие клавиши возврата в подзаголовке входа вызывает отправку основной формы для отправки" в моем текущем проекте путем вставки iframe в главную страницу. Iframe указал на страницу login.aspx, которая аутентифицировала пользователя.

<iframe id="login" src="login.aspx" frameborder="0" enableviewstate="false" scrolling="no" runat="server"></iframe>

(по какой-то причине мне нужен тег закрытия /iframe, иначе дизайн-представление запуталось)

Ответ 8

Вы можете получить доступ к элементам MasterPage из формы aspx: добавьте отрывной тег в форму aspx <% @MasterType VirtualPath = "~/Site.Master% > и в используемом коде Master.FindControl();, чтобы получить контроль по ID

для примера, если вы хотите получить   Форма управления = Мастер .FindControl( "форма" )

теперь вы можете использовать форму основной страницы в своем коде.

Я надеюсь, что эта помощь.

Ответ 9

Salve! В подобной теме я отправил ответ, который может вам помочь. Вы можете использовать jquery для добавления контента в пустой div. Это содержимое может включать теги формы и даже функцию отправки независимо от всего, что делает серверный код. Единственным недостатком этого является то, что у пользователя нет поддержки javascript!

Вместо того, чтобы повторять тот же ответ (и код тоже), вот ссылка:

Форма загрузки Jquery Ajax на веб-странице asp.net

Ответ 10

Это ограничение ASP.NET

ASP.NET предназначен для того, чтобы иметь одну форму на странице и только одну форму. Когда это было изначально спроектировано, это не было проблемой.

Однако с тех пор это было определено как огромная проблема с доступностью.

Microsoft Fix для этого был ASP.NET MVC, если вы можете предложить рассмотреть возможность перехода на ASP.NET MVC, поскольку он решает большое количество проблем с ASP.NET

Ответ 11

У вас может быть более одной формы. (всего лишь 1 видимый за один раз), код 1 = форма 1 видимая/форма 2 скрыта. Код 2 Форма 2 видимая/форма 1 скрыта. = разрешено (это отлично подходит и для статических контактных форм

Ответ 12

нет, вы можете иметь только одну форму asp.net на странице. Это было правило с 1.0

Они должны совместно использовать одну и ту же форму