Хорошо, еще одна дорожная неровность в моем текущем проекте.
У меня никогда не было элементов формы в и то и другое моих главных страницах и страницах контента, я обычно использую все формы в контенте там, где это необходимо.
Однако в текущем проекте у нас есть страница, на которой они хотят и того, и другого. Форма входа в систему вверху справа и форма вопросов в содержании.
Попробовав это сделать, я столкнулся с проблемой жалоб ASP.NET на необходимость наличия единственного элемента формы на главной странице. ТБХ, я действительно не понимаю, почему это требование со стороны ASP.NET, но привет.
Кто-нибудь знает, можно ли / как я могу заставить главные страницы и страницы содержимого содержать элементы формы, которые работают независимо?
Если нет, можете ли вы посоветовать, как действовать, чтобы добиться желаемого внешнего вида / функциональности?
Ограничены ли вы действиями отправки в форме входа? Разве вы не можете использовать пользовательский элемент управления для входа в систему?
Роб, ты прав в своем предположении. ProfK проблема, с которой мы сталкиваемся, заключается в том, что когда пользователь нажимает ввод в форме содержимого, вместо этого отправляется форма входа. Всем спасибо за помощь! :)
После некоторой игры нашел для себя ответ. Надеюсь, это поможет другим, если что-то непонятно, пожалуйста, кричите.





нет, у вас может быть только одна форма asp.net на странице. Это было правилом с 1.0.
Они оба должны иметь одну и ту же форму
Это неверно. У вас может быть только одна форма с runat = "server", но не одна форма. Помните, что, в конце концов, это всего лишь веб-страница :)
когда у вас есть Contentplaceholder, обернутый формой в masterpage, если у других страниц, которые входят в cpholder, есть форма внутри них, тег формы удаляется, когда он служит html для конечного пользователя. это то, что я испытываю прямо сейчас
На странице ASP.NET может быть только одна форма. Один из способов справиться с этим - поместить обработчик событий на кнопку входа на главную страницу. Обработчик проверит пользователя и в случае успеха перенаправит на ту же страницу (чтобы правильно запустить обработчик Page_Load, который запускается перед обработчиками событий).
сам тег формы находится в MasterPage, поэтому вы можете закодировать любые серверные элементы управления asp.net на главной странице по своему желанию. И вы можете записать логику обработки для этих серверных элементов управления в коде главной страницы за файлом.
Итак, в вашем примере вы можете иметь элементы управления входом в систему в правом верхнем углу главной страницы, а затем иметь логику аутентификации на кодовой странице для ГЛАВНОЙ СТРАНИЦЫ, а не на вашей странице содержимого.
Это позволяет вам иметь элементы управления входом на каждой странице и поддерживать эту обработку, а также поддерживать элементы управления содержимым и их обработку на своих отдельных страницах.
Так вы предлагаете обернуть всю страницу внутри <form runat = "server">? Конечно, это решит проблему, но разве это не плохая практика?
Не в веб-формах ASP.Net. Стандартное поведение заключается в том, что вся страница заключена в элемент формы.
Все остальные уже упоминали, что у вас может быть только один элемент формы на данной странице ASP.NET, и что он будет содержаться на главной странице. Все идет нормально. Но я не думаю, что это поможет вам полностью достичь того, чего вы хотите ...
На своих главных страницах вы (я полагаю!) Определили элементы управления asp:ContentPlaceHolder. Ваши страницы, которые используют мастер, имеют соответствующие теги asp:Content. Все содержимое вашей страницы должно помещаться в эти соответствующие теги asp:Content.
Попав в этот тег, они становятся частью формы главной страницы. Главная страница может реагировать на события из своих собственных элементов управления, а сами страницы реагируют на события из своих собственных элементов управления, и все готово.
Если вам нужно, чтобы страница взаимодействовала с главной страницей, вы можете получить к ней доступ через свойство Page.Master. Чтобы взаимодействовать с любым общедоступным кодом (методами, свойствами и т. д.) На главной странице, вы должны привести это свойство к правильному типу и получить доступ к общедоступному коду оттуда.
Это должно привести вас туда, где вам нужно быть в этом сценарии. (У меня это сработало на нескольких сайтах!)
Подумал, что я рассмотрю некоторые из моих нерешенных вопросов и посмотрю, смогу ли я закрыть некоторые из них.
Это было интересное. Я категорически отказался верить, что на странице ASP.NET может быть только одна форма. Для меня это не имело смысла. Я видел множество веб-страниц с более чем одной формой на веб-странице, почему страница ASP.NET должна отличаться?
Итак, это заставило меня задуматься.
Страницы ASP.NET пытаются имитировать среду WinForms, обеспечивая сохранение состояния через модель PostBack. Это обеспечивает элемент состояния для среды без состояния. Для этого среда выполнения должна иметь возможность поддерживать это состояние в каждой «форме». Он делает это, отправляя данные себе. Важно отметить, что:
Для меня это был вопрос на миллион фунтов (я британец). Я понимаю, что это необходимо ASP.NET, особенно если вы используете серверные элементы управления ASP.NET, но какого черта я не могу создавать свои собственные дополнительные формы?
Итак, я подумал, к черту, просто создайте свою собственную форму!
И я сделал. Я добавил стандартную простую форму с действием отправки "#". Затем выполняется POST для текущей страницы с данными формы для данной формы в запросе.
Угадай, что? Все работало нормально. В итоге я получил:
<form runat = "server" id = "aspNetForm"...> </form>. Это означало, что все содержательные страницы автоматически имели форму для работы.Это дало мне относительно простое и понятное решение моей проблемы. Моя форма входа в систему отлично работает в тандеме со всеми созданными формами контента, некоторые из которых являются сложными формами, другие используют множество серверных элементов управления, множество PostBack и т. д.
Надеюсь, это поможет другим.
Роб,
Интересное решение. Я не вижу проблем с тем, что вы делаете. Однако некоторые могут столкнуться с проблемой, если они попытаются сделать это с помощью двух серверных форм. В ASP.NET нет правила, согласно которому вы не можете иметь более одной HTML-формы на странице, просто вы не можете иметь более одной формы «runat = 'server'» на странице. Очевидно, вы нашли довольно простой способ удовлетворить свои потребности.
Я обнаружил, что по большей части работа с одной формой не является проблемой, потому что фреймворк ASP.NET в основном разделяет для нас все с помощью именования контейнеров. Но в своем первоначальном комментарии к посту вы указали на важный фактор, который отсутствовал, но имел решающее значение для сути исходного вопроса: введите ключевое поведение. Это всегда бросает вызов гаечному ключу в работе.
Если бы вы использовали стандартную "всеобъемлющую" серверную форму, не могли бы вы зафиксировать правильное действие с помощью события изменения текста текстового поля? Конечно, если пользователь изменит оба значения до того, как нажать Enter, вы получите странное поведение. И я думаю, что основная проблема с клавишей ввода заключается в том, что если у вас есть более одного ввода для отправки в форме HTML, нажатие ENTER в текстовом поле ничего не делает. Только когда есть единственный элемент INPUT, клавиша ввода вызывает «щелчок» по нему.
Эй, Питер, вы правы в том, что поведение клавиши ввода может быть «интересным»: D С моей конкретной проблемой все работает нормально, поскольку клавиша отправки по умолчанию для формы всегда будет «нажата» при вводе. Кажется, что это всегда нормально работает с сгенерированными формами, поэтому дальнейшие исследования не проводились.
Наверное, стоит добавить, что две формы (Логин, Основное содержимое) просты по дизайну. Логин (HTML) имеет только одну кнопку отправки, а для содержимого (ASP.NET) можно легко задать действие по умолчанию через свойства.
Я решил проблему «нажатие клавиши возврата во вложенной форме входа в систему приводит к отправке основной формы» в моем текущем проекте путем встраивания 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 формы, которые могут работать одновременно.
Вы можете получить доступ к элементам управления MasterPage из формы aspx следующим образом: добавить в aspx форму <% @ MasterType VirtualPath = "~ / Site.Master%> дефектный тег и в коде позади используйте Master.FindControl ();, чтобы получить управление по ID
например, если вы хотите получить Форма управления = Master.FindControl («форма»)
теперь вы можете использовать форму главной страницы в своем коде.
Надеюсь, это поможет.
Бальзам! В аналогичной ветке я опубликовал ответ, который может вам помочь. Вы можете использовать jquery для добавления содержимого в пустой div. Это содержимое может включать теги формы и даже функцию отправки, не зависящую от всего, что делает код на стороне сервера. Единственным недостатком этого является то, что у пользователя не включен javascript!
Вместо того, чтобы повторять тот же ответ (и код тоже), вот ссылка:
Ни в одном из предыдущих ответов не было примера кода. Вот упрощенная версия 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.
Не могли бы вы, возможно, добавить код или сокращенный образец? Правильно ли я полагаю, что вы объявляете [form id = "form1" runat = "server"] как на странице содержимого, так и на главной странице?