#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/>