EVENTTARGET Проблема определения отправителя - PullRequest
3 голосов
/ 18 апреля 2011

Я пытаюсь выяснить, какая кнопка была нажата, этот код прекрасно работает в IE, но если я Chrome, Firefox или Safari, он ничего не делает.При использовании Firebug в Firefox я посмотрел на детали формы, и это показывает, что EVENTTARGET не имеет значения, он просто пуст.Как заставить это работать на FF, Chrome и Safari?

Метод:

       Control postbackControlInstance = null;

        string postbackControlName = page.Request.Params.Get("__EVENTTARGET");
        if (postbackControlName != null && postbackControlName != string.Empty)
        {
            postbackControlInstance = page.FindControl(postbackControlName);
        }
        else
        {
            for (int i = 0; i < page.Request.Form.Keys.Count; i++)
            {
                postbackControlInstance = page.FindControl(page.Request.Form.Keys[i]);
                if (postbackControlInstance is System.Web.UI.WebControls.Button)
                {
                    return postbackControlInstance;
                }
            }
        }
        if (postbackControlInstance == null)
        {
            for (int i = 0; i < page.Request.Form.Count; i++)
            {
                if ((page.Request.Form.Keys[i].EndsWith(".x")) || (page.Request.Form.Keys[i].EndsWith(".y")))
                {
                    postbackControlInstance = page.FindControl(page.Request.Form.Keys[i].Substring(0, page.Request.Form.Keys[i].Length - 2));
                    return postbackControlInstance;
                }
            }
        }
        return postbackControlInstance;

Метод вызова кода:

        if (Page.IsPostBack)
        {
            try
            {
                Control cause = GetPostBackControl(Page);
                string statecause = cause.ID;
                if (statecause == "buttonName1")
                {
                    search(statecause);
                }
                else if (statecause == "buttonNAME2")
                {
                    resetfields();
                }
            }
            catch { }
        }

1 Ответ

3 голосов
/ 18 апреля 2011

Лучший способ - определить, какой элемент управления, вызвавший обратную передачу, переопределить метод protected Page.RaisePostBackEvent.Этот метод используется инфраструктурой ASP.NET для уведомления серверного элемента управления, вызвавшего обратную передачу, о том, что он должен обработать входящее событие обратной передачи:

public class MyPage : Page
{
    protected override void RaisePostBackEvent(
        IPostBackEventHandler sourceControl, 
        string eventArgument
    )
    {
        // here is the control that caused the postback
        var postBackControl = sourceControl;

        base.RaisePostBackEvent(sourceControl, eventArgument);
    }
}

Код, который вы предоставили, должен работать в сценарии, когда на стороне клиента *Функция 1006 * отображается на странице (например, если вы используете только одну кнопку, например <asp:Button runat="server" ID="btnSubmit" Text="submit" UseSubmitBehavior="true" />, она не будет отображаться).

Если даже в случае, когда отображается функция __doPostBack,но параметр __EVENTTARGET является пустым, это означает, что поведение по умолчанию для функции __doPostBack нарушается пользовательским / несовместимым кодом JavaScript в большинстве случаев.В этом случае даже инфраструктура ASP.NET не сможет правильно обрабатывать события обратной передачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...