0
<%@ Page Title="Log In" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="EQ.Account.Login" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>
    Log In
</h2>
<p>
    Please enter your Employee Code and password.
    If you don't have an account Please Contact your Manager.
</p>
<asp:Login ID="LoginUser" runat="server" EnableViewState="false" RenderOuterTable="false">
    <LayoutTemplate>
        <span class="failureNotification">
            <asp:Literal ID="FailureText" runat="server"></asp:Literal>
        </span>
        <asp:ValidationSummary ID="LoginUserValidationSummary" runat="server" CssClass="failureNotification" 
             ValidationGroup="LoginUserValidationGroup"/>
        <div class="accountInfo">
            <fieldset class="login">
                <legend>Account Information</legend>
                <p>
                    <asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">Username:</asp:Label>
                    <asp:TextBox ID="txtUserName" runat="server" CssClass="textEntry"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="UserName" 
                         CssClass="failureNotification" ErrorMessage="User Name is required." ToolTip="User Name is required." 
                         ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
                </p>
                <p>
                    <asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">Password:</asp:Label>
                    <asp:TextBox ID="txtPassword" runat="server" CssClass="passwordEntry" TextMode="Password"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="PasswordRequired" runat="server" ControlToValidate="Password" 
                         CssClass="failureNotification" ErrorMessage="Password is required." ToolTip="Password is required." 
                         ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
                </p>
                <p>
                    <asp:CheckBox ID="RememberMe" runat="server"/>
                    <asp:Label ID="RememberMeLabel" runat="server" AssociatedControlID="RememberMe" CssClass="inline">Keep me logged in</asp:Label>
                </p>
                <p>
                <asp:Label ID="lblErrorMessage" runat="server" CssClass="failureNotification" Visible="false" />
                </p>
            </fieldset>
            <p class="submitButton">
                <asp:Button ID="LoginButton" runat="server" CommandName="Login" Text="Log In" ValidationGroup="LoginUserValidationGroup" OnClick="LoginButton_Click"/>
            </p>
        </div>
    </LayoutTemplate>
</asp:Login>

これは私のASPページですが、CodeBehindページ(Login.aspx.cs)で、lblErrorMessage、txtuserName、txtPasswordなどのコントロールの値を取得しようとすると、「エラー1名前'txtUserName'はに存在しません」というエラーが表示されます。現在のコンテキストC:\ Users \ dsingh \ Documents \ Visual Studio 2010 \ Projects \ EQ \ EQ \ Account \ Login.aspx.cs 6446EQ"。誰かがこの問題を解決し、コードビハインドからのコントロールを認識しない理由を教えてくれるかどうかを待っています。

4

3 に答える 3

1

テキストボックスにアクセスするにUserNameは、FindControlメソッドを使用してオブジェクトツリーをトラバースする必要があります。例えば、

string myValue = (LoginUser.FindControl("UserName") as TextBox).Text;

作業を少し楽にし、コードを読みやすくするために、拡張メソッドを追加して、強く型付けされたコントロールを返すことができます。

// usage
var myControlUsingExtensionMethod = LoginUser.FindControl<TextBox>("UserName").Text;

public static class ControlExtensions
{
    public static T FindControl<T>(this Control control, string id) where T : Control
    {
        return control.FindControl(id) as T;
    }
}
于 2012-06-29T06:42:58.177 に答える
1

Webサイトの代わりにWebApplicationを使用していると思います。その場合は、コードでコントロールを宣言する必要があります。これは、Visual Studioを使用してASPXページを生成し、コントロールが宣言されるとすぐに自動的に行われます。プロパティを使用してサーバーコントロールを作成するとID、コントロールはデザイナーファイルに登録されます。

このようなもの:

namespace WebApplication1 {


    public partial class DynamicControls {

        /// <summary>
        /// form1 control.
        /// </summary>
        /// <remarks>
        /// Auto-generated field.
        /// To modify move field declaration from designer file to code-behind file.
        /// </remarks>
        protected global::System.Web.UI.HtmlControls.HtmlForm form1;

        /// <summary>
        /// lblMessage control.
        /// </summary>
        /// <remarks>
        /// Auto-generated field.
        /// To modify move field declaration from designer file to code-behind file.
        /// </remarks>
        protected global::System.Web.UI.WebControls.Label lblMessage;
    }
}

Webサイトを使用している場合、明示的に宣言する必要はありません。そのジョブは、ユーザーがWebサイトに初めてアクセスしたときにASP.Netコンパイラによって実行されます。

これらのファイルはVisualStudioによって自動的に作成され、ソリューションエクスプローラーに次のように表示されます。

ここに画像の説明を入力してください

于 2012-06-29T06:43:51.460 に答える
0

System.Web.UI.WebControls.Loginasp:Login)コントロールは、そこから派生しSystem.Web.UI.WebControls.CompositeControl、次にを実装しINamingContainerます。

クラスがINamingContainerを実装すると、その子コントロールの「追跡」を担当するようになります。

これらのタイプのコントロールの場合、子コントロールは親コントロールによって動的に作成されるため、コードビハインドでIDを参照するだけでは子コントロールにアクセスできません。代わりに、親コントロールのFindControlメソッドを使用して、それらへの参照を取得する必要があります。

FindControlの使用方法に関するKaneの回答を参照してください。

于 2012-06-29T07:24:38.233 に答える