2

2 つのユーザー コントロールを参照する MasterPage (MyBoxx.Master) があります。

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MyBoxx.master.cs" Inherits="MyBoxxMaster" %>
<%@ Register TagPrefix="uc1" TagName="Header" Src="Header.ascx" %>
<%@ Register TagPrefix="uc1" TagName="Footer" Src="Footer.ascx" %>

私のユーザーコントロール「ヘッダー」には、とりわけ検索ボックスが含まれています。一部のページにアクセスするときに、この検索ボックスを非表示にしたい。したがって、ブール値のプロパティをユーザー コントロールに追加し、ユーザー コントロールをレンダリングするときにこのプロパティを使用して、検索ボックスを表示するかどうかを決定します。

public partial class uxHeader : System.Web.UI.UserControl
{

    bool _showSearch = true;
    public bool ShowSearch
    {
        get { return _showSearch; }
        set { _showSearch = value; }
    }
    [...]
    protected void Page_Load(object sender, EventArgs e)
    {
        [...]
        searchBox.Visible = _showSearch;

    }
}

次に、コンテンツ ページからこの「ShowSearch」プロパティにアクセスしようとします。

((uxHeader)Page.Master.FindControl("Header1")).ShowSearch = false;

問題は、コンパイルしようとすると次のエラーが発生することです。

Error   15  The type or namespace name 'uxHeader' could not be found (are you missing a using directive or an assembly reference?)

問題は、以前にリリースされた製品バージョンで動作するため、ある時点で動作してコンパイルできると確信していることです。しかし、今は同じサイト内の別のものに変更を加えているため、コンパイルできません。

SO に関するさまざまな投稿から、コンテンツ ページ aspx に次の行を追加してみました。

<%@ MasterType VirtualPath="~/MyBoxx.master"%>
<%@ Reference VirtualPath="~/MyBoxx.master" %>

成功せずに!ページのライフサイクルに関するいくつかの回答も見ましたが、実行時のバグではなく、コンパイル時にエラーが発生するため、これはここでは問題になりません。

これを完全に修正する方法について誰かアドバイスがあれば、大いに感謝します。

ありがとう !

4

2 に答える 2

3

さて、私はいくつかの有効な解決策を見つけました...そして、それが以前にどのように/なぜ機能したかを理解したと思います

1)これにはコンパイルが果たす役割があるようです。行にコメントを付けてサイトをコンパイルし、もう一度行を追加しようとすると、タイプ uxHeader は VS で「使用可能」になり、行のコメントを外してサイトを再度コンパイルできます...

2)最初の解決策は明らかに長期的な解決策ではないため、コンテンツページaspxでユーザーコントロールを(もちろん実際に使用せずに)参照するとうまくいくことがわかりました:

<%@ Register TagPrefix="uc1" TagName="Header" Src="Header.ascx" %>

3)これも試してみましたが、これが最もクリーンだと思います...マスターページで、パブリックプロパティを公開します:

public uxHeader PageHeader
{
    get
    {
        return Header1;//Header1 is the id of the userControl dropped in masterpage
    }
}

コンテンツ ページ aspx に、次のように記述します。

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

次に、引き続きコンテンツ ページでコード ビハインドを使用し、サイトのコンパイル後に次のコードを使用できます。

this.Master.PageHeader.ShowSearch = false;

これが、将来、この件に関するヘルプを探している人に役立つことを願っています. これは繰り返しの質問だと思います

于 2013-04-02T12:39:35.047 に答える
1

ユーザー コントロールのコーディング方法によっては、マスター ページ プロパティとしてマスター ページに公開するときに、そのすべてのプロパティ/メソッドにアクセスできる場合とできない場合があります。

これが機能する解決策です:

マスター ページで、ユーザー コントロール (.ascx) を登録し、フォーム タグ内のマスターに配置する必要があります。

ユーザーコントロールを登録する

<%@ Register Src="~/Controls/MyUserControl.ascx" TagPrefix="uc" TagName="MyUserControl" %>

ユーザー コントロールをマスター ページに追加する

<form id="frmMain" runat="server">
        <uc:MyUserControl runat="server" ID="ucMyUserControl" />
        <div id="main-wrapper">
            <div id="main">...

コンテンツ ページについては、コントロールを使用するマスター ページを使用する各コンテンツ ページで参照を作成する必要があります。

コンテンツ ページに参​​照を追加する

<%@ Reference Control="~/Controls/MyUserControl.ascx" %>

ページ レベルでパブリック変数をセットアップし、そのプロパティ/メソッドにアクセスできるようになりました

部分クラス MyPage

  Inherits System.Web.UI.Page

  Public usrCtrl As MyUserControl


Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

    If Master.FindControl("ucMyUserControl") IsNot Nothing Then
        usrCtrl = CType(Master.FindControl("ucMyUserControl"), MyUserControl)
        usrCtrl.ExecMyMethod()
    End If
    ...
于 2014-03-19T15:03:35.773 に答える