Вызов метода ASPX из элемента управления ASCX

#asp.net

#asp.net

Вопрос:

У меня есть метод HasAdminRole() в home.aspx, который я вызываю из элемента управления ASCX. И ASCX работает с использованием (Home)this.Page).HasAdminRole() с пользовательским элементом управления в home.aspx

Теперь, когда я добавляю тот же ASCX на другую страницу ASPX Adminuser.aspx, я получаю сообщение об ошибке, когда ASCX пытается вызвать (Home)this.Page).HasAdminRole() с другой страницы ASPX, чем на home.aspx

Я получаю сообщение об ошибке Невозможно преобразовать объект типа ‘ASP.adminuser_aspx’ в тип ‘CALE.Home’.

Как мне решить эту проблему при использовании одного и того же ASCX в нескольких ASPX, а пользовательский элемент управления пытается вызвать один метод в Home.aspx

Комментарии:

1. Вместо этого переместить метод в элемент управления? Или создать базовый класс страницы, из которого будут получены все страницы, которые затем может ожидать элемент управления?

2. Это работает для метода. Но мне также нужно получить доступ к событию кнопки в aspx. Если пользователь решает перейти на другую страницу, я вызываю метод button_click на этой странице из ascx. if (Menu1. SelectedValue == «showestimateportfolio») ((Home)this.Page).btnEstPortfolio_Click(sender, e); Это работает, когда я на Home.aspx, но я получаю ошибку приведения, когда на любой другой странице aspx.

Ответ №1:

Предложите перенести вашу логику admin / roles из вашего .aspx в класс, доступный как из вашего .aspx, так и из .ascx. Это немного «разделение проблем» и немного аккуратности в использовании логики в общих областях. В основном — сохраняйте логику, связанную со страницей, только в коде вашей страницы.

 public static class Roles
{
    public static HasAdminRole(User someUser)
    {
       // implementation
    }
}
 

Вызовите его из кода любой страницы или другого вспомогательного класса:

  User foo;
 bool isAdmin = Roles.HasAdminRole(foo);
 

Комментарии:

1. Это работает для метода. Но мне также нужно получить доступ к событию кнопки в aspx. Если пользователь решает перейти на другую страницу, я вызываю метод button_click на этой странице из ascx. if (Menu1. SelectedValue == «showestimateportfolio») ((Home)this.Page).btnEstPortfolio_Click(sender, e); Это работает, когда я на Home.aspx, но я получаю ошибку приведения, когда на любой другой странице aspx

Ответ №2:

Итак, я только что нашел решение этой проблемы.

Вы можете создать триггер на стороне клиента на странице aspx и вызвать его с помощью javascript со своей страницы ascx.

например

страница aspx:

 <script>
 function doSomething()
 {
    //set hidden field values or do whatever else you might need to do here
    $('#<%= btnDoSomething.ClientID%>').click();
 }
</script>

 <asp:Button runat="server" ID="btnDoSomething" OnClick="btnDoSomething_Click" CssClass="hidden" />
 

код aspx, лежащий в основе:

 protected void btnDoSomething_Click(object sender, EventArgs e)
        {
            //do whatever you need to on the aspx page
        }
 

Теперь вы можете вызвать эту функцию javascript с любой страницы ascx, которая вам нравится.

например, страница ascx:

 <button type="button" onclick="doSomething()">do something on your aspx page<button/>