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?

3
  • 1
    Possible duplicate of Jquery - Pass asp button command argument with jquery Commented Mar 3, 2017 at 21:33
  • Looks like it. I was hoping something had changed in the last 5 years. Commented Mar 3, 2017 at 21:44
  • what has changed: asp.net mvc is here ;-) Commented Mar 3, 2017 at 21:48

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.