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

Хорошо, еще одна дорожная неровность в моем текущем проекте.

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

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

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

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

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

Не могли бы вы, возможно, добавить код или сокращенный образец? Правильно ли я полагаю, что вы объявляете [form id = "form1" runat = "server"] как на странице содержимого, так и на главной странице?

Rob 07.10.2008 17:26

Ограничены ли вы действиями отправки в форме входа? Разве вы не можете использовать пользовательский элемент управления для входа в систему?

ProfK 07.10.2008 17:31

Роб, ты прав в своем предположении. ProfK проблема, с которой мы сталкиваемся, заключается в том, что когда пользователь нажимает ввод в форме содержимого, вместо этого отправляется форма входа. Всем спасибо за помощь! :)

Rob Cooper 07.10.2008 18:58

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

Rob Cooper 27.10.2008 19:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
24
4
56 061
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

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

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

Это неверно. У вас может быть только одна форма с runat = "server", но не одна форма. Помните, что, в конце концов, это всего лишь веб-страница :)

Rob Cooper 21.11.2008 11:34

когда у вас есть Contentplaceholder, обернутый формой в masterpage, если у других страниц, которые входят в cpholder, есть форма внутри них, тег формы удаляется, когда он служит html для конечного пользователя. это то, что я испытываю прямо сейчас

bh_earth0 24.03.2016 16:58

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

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

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

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

Так вы предлагаете обернуть всю страницу внутри <form runat = "server">? Конечно, это решит проблему, но разве это не плохая практика?

niaher 14.07.2009 04:02

Не в веб-формах ASP.Net. Стандартное поведение заключается в том, что вся страница заключена в элемент формы.

Stephen Wrighton 14.07.2009 06:58

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

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

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

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

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

Ответ принят как подходящий

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

Это было интересное. Я категорически отказался верить, что на странице 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>. Это означало, что все содержательные страницы автоматически имели форму для работы.

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

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

Роб,

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

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

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

Эй, Питер, вы правы в том, что поведение клавиши ввода может быть «интересным»: D С моей конкретной проблемой все работает нормально, поскольку клавиша отправки по умолчанию для формы всегда будет «нажата» при вводе. Кажется, что это всегда нормально работает с сгенерированными формами, поэтому дальнейшие исследования не проводились.

Rob Cooper 21.11.2008 11:30

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

Rob Cooper 21.11.2008 11:31

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

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

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

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

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

Samy S.Rathore 23.07.2013 11:20

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по теме