Элементы формы в главных страницах ASP.NET и страницах содержимого - PullRequest
24 голосов
/ 07 октября 2008

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

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

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

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

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

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

Ответы [ 12 ]

19 голосов
/ 27 октября 2008

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

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

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

Зачем странице ASP.NET требуется элемент формы?

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

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

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

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

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

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

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

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

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

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

5 голосов
/ 07 октября 2008

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

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

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

4 голосов
/ 27 октября 2008

Rob

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

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

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

4 голосов
/ 07 октября 2008

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

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

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

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

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

3 голосов
/ 12 января 2013

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

2 голосов
/ 07 октября 2008

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

0 голосов
/ 16 сентября 2015

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

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

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

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

0 голосов
/ 19 ноября 2011

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

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

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

0 голосов
/ 07 ноября 2010

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

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

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

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

0 голосов
/ 31 марта 2010

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

...