ASP.Net более 1 формы? - PullRequest
       15

ASP.Net более 1 формы?

4 голосов
/ 02 ноября 2009

На каждой странице (сидя в мастере) у меня есть поля логина.

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

Как мне установить для этого более одного <form> тега?

Ответы [ 5 ]

5 голосов
/ 02 ноября 2009

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

http://www.codeproject.com/KB/aspnet/CHtmlForm.aspx

3 голосов
/ 02 ноября 2009

К сожалению, в ASPNET Forms вы можете иметь только один тег FORM с атрибутом runat="server".

Однако вы можете иметь столько тегов FORM, сколько захотите, если исключите атрибут runat="server" (и если они не вложены друг в друга).

Например, на вашей главной странице вы можете иметь форму входа в систему вверху страницы, а затем добавить форму с runat="server" несколько ниже:

<form action="login" method="post">
  <input type="text" name="username" />
  <input type="password" name="password" />
  <input type="submit" value="Login" />
</form>

<form runat="server">
  ... place server controls here ...
</form>
1 голос
/ 02 ноября 2009

Вы можете использовать группы проверки для разделения формы на несколько логических форм, чтобы можно было вызывать проверку в обработчиках событий Click для кнопок. Это действительно все, для чего вам нужно несколько форм в ASP.Net, если только вы не пытались избежать отправки данных из всех полей формы обратно при обратной передаче.

Попробуйте следующий пример страницы:

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <script runat="server">
        protected void btnSendMessage_Click(object sender, EventArgs e)
        {
            Page.Validate("contact");

            if (!Page.IsValid)
                return;
        }

        protected void btnLogin_Click(object sender, EventArgs e)
        {
            Page.Validate("login");

            if (!Page.IsValid)
                return;
        }
    </script>
    <table>
        <tr>
            <td>
                <asp:Label ID="lblUsername" AssociatedControlID="txtName" runat="server">Username:</asp:Label>
            </td>
            <td>
                <asp:TextBox ID="txtName" ValidationGroup="login" runat="server" />
                <asp:RequiredFieldValidator ID="reqName" ControlToValidate="txtName" Display="Dynamic" ErrorMessage="You must supply a username" 
                    ValidationGroup="login" runat="server" />
            </td>
        </tr>
        <tr>
            <td>
                <asp:Label ID="lblPassword" AssociatedControlID="txtPassword" runat="server">Password:</asp:Label>
            </td>
            <td>
                <asp:TextBox ID="txtPassword" ValidationGroup="login" runat="server" />
                <asp:RequiredFieldValidator ID="reqPassword" ControlToValidate="txtPassword" Display="Dynamic" ErrorMessage="You must supply a password" 
                    ValidationGroup="login" runat="server" />
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <asp:Button ID="btnLogin" Text="Login" ValidationGroup="login" OnClick="btnLogin_Click" runat="server" />
            </td>
        </tr>
    </table>
    <hr />

    <h1>Contact</h1>

    <table>
        <tr>
            <td>
                <asp:Label ID="lblYourName" AssociatedControlID="txtYourName" runat="server">Your name:</asp:Label>
            </td>
           <td>
                <asp:TextBox ID="txtYourName" runat="server" ValidationGroup="contact" />
                <asp:RequiredFieldValidator ID="reqYourName" ControlToValidate="txtYourName" Display="Dynamic" ErrorMessage="Tell us your name!" 
                    ValidationGroup="contact" runat="server" />
           </td>
        </tr>
        <tr>
            <td>
                <asp:Label ID="lblYourEmail" AssociatedControlID="txtYourEmail" runat="server">Your email:</asp:Label>
            </td>
           <td>
                <asp:TextBox ID="txtYourEmail" runat="server" ValidationGroup="contact" />
                <asp:RequiredFieldValidator ID="reqEmail" ControlToValidate="txtYourEmail" Display="Dynamic" ErrorMessage="Tell us your email!" 
                    ValidationGroup="contact" runat="server" />
           </td>
        </tr>
        <tr>
            <td>
                <asp:Label ID="lblMessage" AssociatedControlID="txtMessage" runat="server">Your message:</asp:Label>
            </td>
           <td>
                <asp:TextBox ID="txtMessage" TextMode="MultiLine" runat="server" ValidationGroup="contact" />
                <asp:RequiredFieldValidator ID="reqMessage" ControlToValidate="txtMessage" Display="Dynamic" ErrorMessage="We need you to send us a message!" 
                    ValidationGroup="contact" runat="server" />
           </td>
        </tr>
        <tr>
            <td colspan="2">
                <asp:Button ID="btnSendMessage" ValidationGroup="contact" Text="Contact" OnClick="btnSendMessage_Click" runat="server" />
            </td>
        </tr>        
    </table>
    </form>
</body>
</html>

Здесь вы получаете подтверждение, и оно ведет себя как две отдельные формы, хотя данные из обеих «форм» будут отправлены обратно.

Это стандартная парадигма для нескольких действий на странице, существующая со времени ASP.Net 2:).

Пожалуйста, прости за использование встроенного кода, я подумал, что это поможет последовать примеру.

1 голос
/ 02 ноября 2009

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

http://www.codersbarn.com/post/2008/03/08/Solution-to-ASPNET-Form-PayPal-Problem.aspx

Надеюсь, это поможет: -)

1 голос
/ 02 ноября 2009

это нельзя сделать с помощью веб-форм Asp.net (у вас может быть много форм, но только у одной должна быть runat = "server", которая не является парактической), но вы можете легко это сделать с помощью Asp.net MVC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...