0

I've created a generic event handler for On-type events.

function OnHandler() {
    $('#hfOnHandlerControl').val(event.target.id);
    $('#hfOnHandlerEvent').val(event.type);
    $('#hfOnHandlerArgs').val(null);

    var argstring = "";
    if (arguments.length > 0) {
        for (index = 0; index < arguments.length; ++index) {
            argstring += `"${arguments[index]}"`;
            argstring += (index+1<arguments.length)? "||#||" : "";
        }
       // alert(argstring);
        $('#hfOnHandlerArgs').val(argstring);
    }
    $('#btnOnHandler').attr('CommandName', event.type);
    $('#btnOnHandler').attr('CommandArgument',event.target.id + '||#||' + argstring);
    $("#btnOnHandler").click();
};

It is called like this, for instance:

<asp:TextBox runat="server" ID="tbWebsite" Width="223px" onblur="OnHandler('xxx','p2','p3');">

The onclick function in the javascript "clicks" this button:

<asp:Button ID="btnOnHandler" runat="server" ClientIDMode="Static" Text="" OnCommand="btnOnHandler_OnCommand" CausesValidation="False"/>

which, in turn, executes this codebehind:

protected void btnOnHandler_OnCommand(Object sender, CommandEventArgs e)
    {
        var ctl = FindControlByClientId(Page,hfOnHandlerControl.Value).ID;
        var action = hfOnHandlerEvent.Value;
        var args = hfOnHandlerArgs.Value;
        var theMethod = this.GetType().GetMethod($"Handler_{ctl}On{action}");
        Object[] parametersArray = null;
        if (!String.IsNullOrEmpty(args))
        {
            parametersArray = args.Split(new String[]{"||#||"}, StringSplitOptions.None).Cast<Object>().ToArray();
        }
        theMethod.Invoke(this, parametersArray);
    }

which invokes something like

    public void Handler_tbWebsiteOnblur(String p1,String p2,String p3)
    {
        var pai = new PortalAliasController().GetPortalAlias(@"store." + tbWebsite.Text); //returns PortalAliasInfo
        if (pai != null)
        {
            //Alias already exists. Let's have a hidden status box that gets displayed
            tbWebsite.Focus();
            lblWebsiteError.Text = @"Website Already Exists...";
            lblWebsiteError.Visible = true;
            btnSubmit.Enabled = false;
        }
        else
        {
            lblWebsiteError.Visible = false;
            btnSubmit.Enabled = true;
            tbCompany.Focus();
        }
    }

My issue:

How do I avoid using the hidden fields and instead pass everything through CommandName and CommandArgument? You can see I've tried adding an attribute and value but regardless, "e" in

btnOnHandler_OnCommand(Object sender, CommandEventArgs e)

is always empty.

I've seen solutions like using ViewState and the already-tried attribute additions but nothing works. What am I missing?

Chris
  • 650
  • 7
  • 20

0 Answers0