Что я делаю не так в ASP.NET - PullRequest
2 голосов
/ 06 августа 2010

Вот мой код главной страницы:

namespace mysite.MasterPages
{
    public partial class Main : System.Web.UI.MasterPage
    {
        public bool isLoggedIn;

        protected void Page_Load(object sender, EventArgs e)
        {
            isLoggedIn = Request.IsAuthenticated;      // Is the user currently logged in
        }
    }
}

Вот мой код страницы регистрации:

namespace mysite
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (((MasterPage)Page.Master).isLoggedIn)
            {
                Response.Redirect("default.aspx");
            }
        }
    }
}

Я пытаюсь сделать isloggedIn доступным для всех страниц, используяэто как главная страница!Я получаю сообщения об ошибках:

Ошибка 2 Имя isLoggedIn не существует в текущем контексте

Ошибка 3 System.Web.UI.MasterPage 'не содержит определениядля 'isLoggedIn' и метода расширения 'isLoggedIn', принимающего первый аргумент типа 'System.Web.UI.MasterPage', не найдено (отсутствует директива using или ссылка на сборку?)* Любая помощь приветствуется.

Ответы [ 4 ]

2 голосов
/ 06 августа 2010

добавить <%@ MasterType VirtualPath="~/Main.master" %> к разметке вашей страницы.

и ваш this.Master тип становится AlphaPack.MasterPages.Main вместо System.Web.UI.MasterPage. Таким образом, вы сможете получить к нему доступ без приведения:

 this.Master.IsLoggednIn

На данный момент вам нужно сделать следующее:

((AlphaPack.MasterPages.Main)this.Master).isLoggednIn

А лучше - создать собственность. И удерживайте данные не в переменной, а в ViewState (прочитайте Состояние управления и состояние просмотра ):

namespace AlphaPack.MasterPages
{
    public partial class Main : System.Web.UI.MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.IsLoggedIn = Request.IsAuthenticated;
        }

        public bool IsLoggedIn
        {
            get { return this.ViewState["isLoggedIn"] as bool? ?? false; }
            set { this.ViewState["isLoggedIn"] = value; }
        }
    }
}

А как насчет кода? Я рекомендую использовать проект веб-приложения, а не проект веб-сайта (который устарел)!

Используется следующий синтаксис разметки. Веб-приложение:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyPage.aspx.cs" Inherits="MyNamespace.MyPage" MasterPageFile="~/MyMaster.master" Title="MyTitile" %>

и веб-сайт:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MyPage.aspx.cs" Inherits="MyPage" MasterPageFile="~/MyMaster.master" Title="MyTitile" %>
1 голос
/ 06 августа 2010
if (((MasterPage)Page.Master).isLoggedIn)

Должно быть

if (((mysite.MasterPages.Main)Page.Master).isLoggedIn)

Вы применяете Master к типу MasterPage (который бесполезен, поскольку уже является MasterPage). Но MasterPage не содержит свойства isLoggedIn. Вот почему вы не можете получить к нему доступ.

Итак, просто приведите свойство Master к нужному типу, в вашем случае mysite.MasterPages.Main

0 голосов
/ 06 августа 2010

Проблема здесь в том, что вы объявляете isLoggedIn внутри встроенного кодового блока, поэтому он будет виден только внутри этого блока.

Вам нужно будет добавить его в качестве переменной в классе code-behind или в тегах <script runat="server"></script>, если добавляете встроенный код на стороне сервера, т.е.

<script runat="server">

    public bool IsLoggedIn;

    protected void Page_Load(object sender, EventArgs e)
    {
        IsLoggedIn = Request.IsAuthenticated;
    }

</script>

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

<%
    if (((MasterPage)Page.Master).IsLoggedIn)
    {
    }
%>

Однако я не уверен, что это лучший способ добиться того, чего вы хотите. Вероятно, я бы взял эту логику из главной страницы и вставил ее в специально созданный класс или службу аутентификации.

0 голосов
/ 06 августа 2010

Обычно такие глобальные «состояния» хранятся внутри переменной сеанса. Вы передаете его как параметр строки запроса?

А почему вы не помещаете код в код позади?

Редактировать 1:

Просто переместите эту логику:

  Response.Redirect("default.aspx");

прямо на вашу главную страницу:

 protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.IsAuthenticated)      // Is the user currently logged in
        {
            Response.Redirect("default.aspx");
        }
    }

Если это поведение по умолчанию, которое вы хотите для всех страниц, которые будут использовать эту мастер-страницу.

Редактировать 2:

Вы сказали в комментарии:

и как мне получить доступ к переменная на других страницах?

Я могу придумать 3 способа:

  • Строка запроса (на запрос страницы)
  • ViewState (на страницу)
  • Переменная сессии (доступно глобально)
...