Я получаю исключение InvalidCastException - PullRequest
0 голосов
/ 02 мая 2020

Я хочу получить asp идентификатор кнопки с предыдущей страницы, и я получаю исключение. Вот мой код для C#

public partial class ADD_MOBILE : System.Web.UI.Page
{
        string BUTN_ID;
        protected void Page_Load(object sender, EventArgs e)
        {
            Button button = (Button)sender;
            string BUTTON_CLICKER_ID = button.ID;
            BUTN_ID = BUTTON_CLICKER_ID;
        }
        protected void saveMOBILE_Click(object sender, EventArgs e)
        {
            if(BUTN_ID == "samsung"){ ... }        
        }
}

В этот момент я получаю исключение Button button = (Button)sender; почему?

1 Ответ

0 голосов
/ 02 мая 2020

Хорошо, после просмотра кода кажется, что вы хотите получить идентификатор кнопки, чтобы вы могли обработать некоторый код на основе этого. Что ж, позвольте мне кое-что прояснить: событие Page Load никогда не даст вам элемент управления, который вызвал обратную передачу в объекте отправителя, даже если он срабатывает при нажатии кнопки и отправляет сообщение обратно, но в нем НЕ будет содержаться информация в объекте отправителя для элемента управления. который отправил его обратно.

Для этого вы можете использовать этот подход из ответа Джеймса Джонсона , чтобы узнать, какой элемент управления вызвал обратную передачу:

/// <summary>
/// Retrieves the control that caused the postback.
/// </summary>
/// <param name="page"></param>
/// <returns></returns>
private Control GetControlThatCausedPostBack(Page page)
{
    //initialize a control and set it to null
    Control ctrl = null;

    //get the event target name and find the control
    string ctrlName = page.Request.Params.Get("__EVENTTARGET");
    if (!String.IsNullOrEmpty(ctrlName))
        ctrl = page.FindControl(ctrlName);

    //return the control to the calling method
    return ctrl;
}

This вернет объект Control, в который вы можете в дальнейшем углубиться.

В противном случае подходящим и аккуратным подходом в вашем случае будет сделать это так:

public partial class ADD_MOBILE : System.Web.UI.Page
{
        string BUTN_ID; // I do not think it is necessary here.
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        protected void saveMOBILE_Click(object sender, EventArgs e)
        {
            Button button = (Button)sender;
            if(button is null) return; // you can use == instead of keyword 'is'

            if(button.ID.Equals("samsung"))
            {
                 // DoStuff();
            }        
        }
}

Я надеюсь Вы находите это полезным.

...