fc2ブログ

記事一覧

コントロールにコード ブロック (<% ... %>) が含まれているため、コントロールのコレクションを変更できません。 | asp.net


今回は asp.net で HTML のヘッダータグに関するエラーの解決方法について3通りの方法をご紹介したいと思います。
エラーの内容は「コントロールにコード ブロック (<% ... %>) が含まれているため、コントロールのコレクションを変更できません。」です。


aspnet_codeblock_01.png


前提条件
・Windows 10 v1903 以降 / Windows Server 2012 以降
・Visual Studio 2013 Professional 以降
・VB.NET
・.Net Framework 4.0 以降



エラー発生条件

aspx ページの head タグがサーバーコントロールになっており、head タグ内にインライン式が埋め込まれている状態で、VB からヘッダーのコントロールを追加するようにコーディングします。すると、今回のエラーが発生します。

Base.Master
<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Base.master.vb" Inherits="AspNetTest.Base" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><%--VBから変更できるようにサーバーコントロールになっています。--%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<%--インライン式--%>
<%--表示式--%>
<link href="<%= Me.ResolveUrl("~/App_Themes/default/css/style.css") %>" rel="stylesheet" type="text/css" />
<%--埋め込みコードブロック--%>
<% If False Then %>
<% End If %>
</head>
<body>
</body>
</html>


Base.Master.vb
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

If Not IsPostBack Then

Dim meta As New HtmlMeta()
meta.Attributes.Add("name", "著者名")
meta.Attributes.Add("content", "任意の著者情報")
Me.Page.Master.Controls.Add(meta)

End If

End Sub



方法1.全てインライン式で実装する

VBからサーバーコントロールを追加するコードをあきらめて、全てインライン式(特に埋め込みコードブロックや表示式)を駆使してページを分岐・構成する方法がありますが、私はお勧めしません。ページ自体の可読性が低下しますし、処理にも限界があります。

Base.Master
<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Base.master.vb" Inherits="AspNetTest.Base" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<%--インライン式--%>
<%--表示式--%>
<link href="<%= Me.ResolveUrl("~/App_Themes/default/css/style.css") %>" rel="stylesheet" type="text/css" />
<%--埋め込みコードブロック--%>
<% If False Then %>
<% End If %>
<meta name="<%= Me.GetAuthorName %>" content="<%= Me.GetAuthorContent %>"/>
</head>
<body>
</body>
</html>


Base.Master.vb
Public Class Base
Inherits System.Web.UI.MasterPage

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

If Not IsPostBack Then
End If

End Sub

Public ReadOnly Property GetAuthorName As String
Get
Return "著者名"
End Get
End Property
Public ReadOnly Property GetAuthorContent As String
Get
Return "任意の著者情報"
End Get
End Property

End Class



方法2.全てVBコードで実装する

インライン式を全て取り除き、head タグ内のコントロールを全て VB コードから追加するように実装します。既にインライン式が実装されていたりすると、VB コードへの変更にコストがかかってしまいます。

Base.Master
<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Base.master.vb" Inherits="AspNetTest.Base" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><%--VBから変更できるようにサーバーコントロールになっています。--%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
</body>
</html>


Base.Master.vb
Public Class Base
Inherits System.Web.UI.MasterPage

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

If Not IsPostBack Then

Dim link As New HtmlLink()
link.Href = Me.ResolveUrl("~/App_Themes/default/css/style.css")
link.Attributes.Add("rel", "stylesheet")
link.Attributes.Add("type", "text/css")
Me.Page.Master.Controls.Add(link)

Dim meta As New HtmlMeta()
meta.Attributes.Add("name", "著者名")
meta.Attributes.Add("content", "任意の著者情報")
Me.Page.Master.Controls.Add(meta)

End If

End Sub
End Class



方法3.PlaceHolderで囲む

head タグ内のインライン式を全て PlaceHolder 内に囲みます。それだけで、既存のインライン式を変更することなく、かつ VBコードから head タグ内のコントロ―ルを追加することもできます。

Base.Master
<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Base.master.vb" Inherits="AspNetTest.Base" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><%--VBから変更できるようにサーバーコントロールになっています。--%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<asp:PlaceHolder ID="plcStyle" runat="server">
<%--インライン式--%>
<%--表示式--%>
<link href="<%= Me.ResolveUrl("~/App_Themes/default/css/style.css") %>" rel="stylesheet" type="text/css" />
<%--埋め込みコードブロック--%>
<% If False Then %>
<% End If %>
</asp:PlaceHolder>
</head>
<body>
</body>
</html>


Base.Master.vb
Public Class Base
Inherits System.Web.UI.MasterPage

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

If Not IsPostBack Then

Dim meta As New HtmlMeta()
meta.Attributes.Add("name", "著者名")
meta.Attributes.Add("content", "任意の著者情報")
Me.Page.Master.Controls.Add(meta)

End If

End Sub
End Class






最後までお読みいただきありがとうございます。
いかがでしたでしょうか。他にも asp.net に関連する記事を投稿しておりますのでよろしければご参考くださいませ。



関連記事

コメント

すごく助かりました
ありがとうございます。
自分一人だと解決にどれだけ時間がかかったかわからないです。
コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。