3

いくつかのコードを実行するよりも、いくつかのボタン (ASP ボタン) のクリックをインターセプトできるコードを記述する必要があり、メソッドが true を返す場合は、元のクリックを呼び出します。

ポイントは次のとおりです。

1- 元のクリックを保存する方法がわかりません。

2- クリックされたボタンを特定します。

元:

    protected void Page_Load(object sender, EventArgs e)
    {
        var b = getButtonThatWasClicked();

        var originalClick = b.Click;

        if(callSomeMethod(b))
            originalClick(null,null);
    }

編集:

これでクリックを行ったボタンを取得できました...今、元のクリックが呼び出されるのを防ぐ必要があります。以下の方法はうまくいきませんでした。元のクリックを新しいハンドラーにオーバーライドしても、古いハンドラーが呼び出されて実行されました。私はASP.NETがそれを読んで、呼び出されるイベントのコールスタックのようなものを作ることをしています.ハンドラーがスタック内の古いものを変更しても。

    public void ButtonsTestMethod()
    {
        var listOfButtons = listaDeBotes.Where(b => b.CommandName != "");

        foreach (var button in listOfButtons)
        {
            if (Request.Form[button.UniqueID] != null)
            {
                var buttonFromRequest = Request.Form[button.UniqueID];
                if (buttonFromRequest == null)
                    continue;

                if (button.CommandName != "xxx")
                { 
                    //validate things
                    //if(TemPermissao(Tela,GetAcaoDoBotao(botao.CommandName)))
                    //if(!canexecuteSomething())
                    button.Click += new EventHandler(defaultClick);   
                }
            }
        }
    }

    void defaultClick(object sender, EventArgs e)
    {
        //show error
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        //other code
        ButtonsTestMethod();
    }

可能かどうかはわかりませんが、助けていただければ幸いです=/

ありがとう。

4

2 に答える 2

6

コントロール名を取得するには、ページの読み込みで次のことを試すことができます。

protected void Page_Load(object sender, EventArgs e)
 {
    if( IsPostBack ) 
    {
        string senderControl = Request.Params["__EVENTTARGET"].ToString();
        //senderControl will contain the name of the button/control responsible for PostBack
    }
  }
于 2012-07-31T20:05:39.210 に答える
0

ボタン クリック イベント ハンドラーの最初の引数は送信者です。その送信者をオブジェクトとしてキャストするButtonと、そのオブジェクトに基づいたボタンを識別できるはずです。そうすれば、どちらがクリックされたかを判断する機能をなくすことができます。

void GreetingBtn_Click(Object sender, EventArgs e)
{
    Button clickedButton = (Button)sender;
    if(clickedButton.Text == "bla")
    {
        //Do stuff
    }
} 
于 2012-07-31T19:58:16.850 に答える