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

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

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

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

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

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

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

12 ответов


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

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

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

почему a ASP.NET страница нужно элемент формы?

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

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

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

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

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

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

угадайте, что? Все работало отлично. Поэтому я закончил:

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

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

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


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

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

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


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

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

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

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

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


Роб

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

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

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


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

<%@ 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>

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


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


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

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

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


вы можете получить доступ к элементам управления MasterPage из формы aspx с помощью: добавьте тег detractive в форму aspx и в коде использовать мастер.FindControl(); чтобы получить контроль по ID

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

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

надеюсь, это поможет.


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

вместо переноса один и тот же ответ (и код тоже), вот ссылка:

форма загрузки jQuery Ajax на asp.net webform


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

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

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

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


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


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

Они оба должны иметь одинаковую форму