Доступ к общим свойствам ASP.NET Master Pager на дочерней странице - PullRequest
0 голосов
/ 28 сентября 2010

Мне стыдно спрашивать об этом здесь, потому что он уже несколько раз дублировался в StackOverflow.Я прочитал много вещей, включая:

http://msdn.microsoft.com/en-us/library/xxwa0ff0

http://msdn.microsoft.com/en-us/library/c8y19k6h.aspx

http://www.velocityreviews.com/forums/t110056-cannot-access-strongly-typed-properties-in-master-page.html

Я думаю, что я 'мы сделали именно то, что говорится в этой статье, но это не работает для меня.

Вот верх моей главной страницы с именем "MasterNoNews.master":

<%@ Master Language="C#" %>
<%@ Import Namespace="MyMediHealth.DataAccess" %>
<%@ Import Namespace="MyMediHealth.DataAccess.Containers" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    public virtual UserContainer CurrentUser;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.IsAuthenticated)
            CurrentUser = new MembershipQueries().getUserFromUserIdName(Page.User.Identity.Name);
    }
</script>

Вот верх моей дочерней страницы с именем "MyProfile.aspx":

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterNoNews.master"
AutoEventWireup="true" CodeBehind="MyProfile.aspx.cs" 
Inherits="MyMediHealth.Interface.MyProfile" %>
<%@ MasterType VirtualPath="~/MasterNoNews.master" %>

Вот код на моей дочерней странице с именем «MyProfile.aspx.cs», который не работает:

using System;
using System.Web.UI;
using MyMediHealth.DataAccess.Containers;
using MyMediHealth.DataAccess;

namespace MyMediHealth.Interface
{
    public partial class MyProfile : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // doesn't work
            UserContainer user = Master.CurrentUser;
            // also doesn't work
            UserContainer user = ((MasterNoNews)this.Master).CurrentUser
        }    
    }    
}

В первом случае VS сообщает мне System.Web.Ui.MasterPage не содержит определения для CurrentUser.Во втором случае VS говорит, что тип или пространство имен 'MasterNoNews' не найдено.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 28 сентября 2010

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

<% @ MasterType VirtualPath = "~ / MasterPages / Site.master"%>

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

UserContainer user = Page.Master.CurrentUser

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

0 голосов
/ 28 сентября 2010

Это не будет работать, потому что вы создали свойства на главной странице (а не в коде). Как правило, код главной страницы компилируется динамически, а имя класса (в зависимости от имени файла) создается во временной сборке. Поскольку вы не ссылаетесь на это сгенерированное имя класса во временной сборке, вы получаете ошибку. Правильный путь будет иметь код позади файла для мастера. Например, master будет

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="MasterNoNews.master.cs" Inherits="[Your Namespace].MasterNoNews" %>

А в файле code-behind (MasterNoNews.master.cs) есть ваши свойства:

namespace [Your Namespace]
{

    public partial class MasterNoNews : System.Web.UI.MasterPage
    {
      public virtual UserContainer CurrentUser;

      protected void Page_Load(object sender, EventArgs e)
      {
        if (Request.IsAuthenticated)
            CurrentUser = new MembershipQueries().getUserFromUserIdName(Page.User.Identity.Name);
      }
    }
}

Теперь второй синтаксис будет работать, т.е.

UserContainer user = (([Your Namespace].MasterNoNews)this.Master).CurrentUser
...