web-dev-qa-db-fra.com

Méthode de focus perdu pour la zone de texte asp.net?

Comment écrire la méthode de focus perdu pour la méthode de texte asp.net? S'il vous plaît quelqu'un a une idée pour écrire ceci, partager avec moi?

25
James123

Je sais donc que tout le monde a montré l'approche de base côté client, et c'est correct, mais je voulais au moins montrer une solution pour gérer un événement spécifique côté client sur le serveur.

Jetons un coup d'œil au code et examinons-le pièce par pièce.

Comme ASP.Net TextBox n’expose pas d’événement côté serveur pour OnBlur, vous devrez le faire manuellement. Heureusement, c'est assez facile à réaliser. Supposons que vous ayez ce petit morceau de code dans votre page .aspx. Vous souhaitez mettre à jour un côté serveur de contrôle Label chaque fois que la zone de texte perd le focus.

<asp:Label ID="lblOnBlur" runat="server">On Blur Example</asp:Label><br />
<asp:TextBox ID="tbOnBlur" runat="server" ClientIDMode="Static" /><br />
<asp:Label ID="lblOutput" runat="server" />

ASP.Net a une fonction côté client } intégrée qui est appelée pour déclencher des publications avec deux paramètres:

  1. Cible (l'ID du contrôle à l'origine de l'événement)
  2. Argument (informations facultatives à transmettre au serveur) 

Vous pourriez simplement relier l'événement à la balise en ajoutant l'attribut et la valeur suivants à votre zone de texte:

onblur="__doPostBack('tbOnBlur','OnBlur');"

Cependant, le framework offre un moyen simple de générer ce script pour votre serveur. Dans votre méthode Page_Init, ajoutez simplement un appel à GetPostBackEventReference et affectez-le à l'attribut "onblur" pour que vous le contrôliez de la manière suivante:

protected void Page_Init(object sender, EventArgs e)
{
    var onBlurScript = Page.ClientScript.GetPostBackEventReference(tbOnBlur, "OnBlur");
    tbOnBlur.Attributes.Add("onblur", onBlurScript);
}

Avec les événements de contrôle de serveur standard, le câblage et l'appel des événements sont gérés automatiquement pour vous en implémentant IPostBackEventHandler . Cela représente beaucoup de travail pour une solution ponctuelle, nous allons donc simplement la gérer manuellement en inspectant les paramètres de la demande.

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        var ctrlName = Request.Params[Page.postEventSourceID];
        var args = Request.Params[Page.postEventArgumentID];

        HandleCustomPostbackEvent(ctrlName, args);
    }
}

private void HandleCustomPostbackEvent(string ctrlName, string args)
{
    //Since this will get called for every postback, we only
    // want to handle a specific combination of control
    // and argument.
    if (ctrlName == tbOnBlur.UniqueID && args == "OnBlur")
    {
        lblOutput.Text = "On Blur Event Handled Server Side!" + DateTime.Now;
    }
}

En fin de compte, il n'est pas très difficile de simuler des événements côté serveur si cela ne vous dérange pas de creuser un peu le framework.

J'espère que cela t'aides!

À votre santé,
Josh

35
Josh

Si vous voulez que le serveur fasse quelque chose après que la zone de texte perd son focus, vous pouvez ajouter AutoPostback = "True" et, si vous ne voulez pas que la publication recharge la page entière, utilisez un UpdatePanel:

    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true" 
                            OnTextChanged="TextBox1_TextChanged" />
        </ContentTemplate>
    </asp:UpdatePanel>

La fonction TextBox1_TextChanged peut alors faire quelque chose avec le texte (serveride).

15
Willem
if (!Page.IsPostBack)
    {
        txtName.Attributes.Add("onblur","alert('Hello world')");
    }
4
Zo Has

Pourquoi n'utilisez-vous pas cela? Lostfocus fonctionne de la même manière avec:

OnTextChanged="TextBox_TextChanged"
0
elfekz