前提・実現したいこと
ASP.NETにて動的に呼び出すユーザ―コントロールを変更したいと思っております。
理由としてはサイト構築の手法についての方針が、
IISでURLパーマをかけてすべてのrequestが、Default.aspxで受け取ります。
URL
1例: 2http://abc.com → http://abc.com 3http://abc.com/123/233 → http//:abc.com?s1=123&s2=233
通常は、
asp
1<%@ Register Tagprefix = "win" Tagname="NaviHeader" Src="~/123.ascx" %>
などで宣言して画面配置先に
asp
1<win:NaviHeader id="navi" runat="Server" />
で配置されると思いますが
今回は、送信されてくるGET値によりユーザ―コントロールをを呼び出す手段
Src=の部分を、~/123.ascx だったり ~/321.ascx だったりと変更したいと思っております。
asp
1<%@ Register Tagprefix = "win" Tagname="NaviHeader" Src="~/123.ascx" %>
開発管理、保守管理上追加したい要件。
- ロード時に今回の処理に必要な情報のみを初期化、設定したい
- Default.aspxから読み込む情報は
デザインコーディングのためにビジュアルスタジオのGUIを利用を想定
デザイン・処理ごとにファイルを分けたい
- 読み込む各ユーザーコントロールにはそれぞれの処理が存在するが、
Default.aspxにも基本的な処理・共通の処理が入ると思う。
情報お待ちしております。
試したこと
1.宣言時にIF文で試してみる。
asp
1<% If Request.QueryString("so") = "123" Then %> 2<%@ Register Tagprefix = "win" Tagname="NaviHeader" Src="~/123.ascx" %> 3<% Else %> 4<%@ Register Tagprefix = "win" Tagname="NaviHeader" Src="~/321.ascx" %> 5<% End If %>
asp
12.宣言部分を変数にしてみる。 2<%@ Register Tagprefix = "win" Tagname="NaviHeader" Src="~/" & Request.QueryString("so1") & ".ascx" %>
3.以下のサイトを参考にユーザ―コントロールを変数にしてみる。
ユーザーコントロールを動的に生成する
リンク内容
ascxに以下の記述を入れて
asp
1<%@ Register Tagprefix = "win" Tagname="NaviHeader" Src="~/123.ascx" %> 2<win:NaviHeader id="navi" runat="Server" />
ascx.vbのLoadイベントに以下を追記
vb
1 Dim uc As UserControl 2 If Request.Item("so1") = "login" Then 3 uc = Page.LoadControl("login.ascx") 4 ElseIf Request.Item("so1") = "login2" Then 5 uc = Page.LoadControl("login2.ascx") 6 Else 7 uc = Page.LoadControl("login2.ascx") 8 End If 9 navi = uc
###現状のソース
asp
1<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> 2<%@ Import Namespace="System.Data" %> 3<%@ Import Namespace="System.Data.SqlClient" %> 4 5<% If Request.QueryString("so") = "123" Then %> 6<%@ Register Tagprefix = "win1" Tagname="NaviHeader" Src="~/123.ascx" %> 7<% Else %> 8<%@ Register Tagprefix = "win2" Tagname="NaviHeader" Src="~/321.ascx" %> 9<% End If %> 10 11<!DOCTYPE html> 12<html lang="ja"> 13 <head> 14<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 15 <meta charset="utf-8" /> 16 <title><% = DateTime.Now.Year %></title> 17 </head> 18 <body> 19 <form runat="Server"> 20 <!--メインコンテンツ--> 21 <win1:NaviHeader id="navi" runat="Server" /> 22 <win2:NaviHeader id="navi" runat="Server" /> 23 </form> 24 </body> 25</html> 26 27
Default.aspx.vb(初期表示状態)
VB
1Partial Class _Default 2 Inherits System.Web.UI.Page 3 Private Sub _Default_Load(sender As Object, e As EventArgs) Handles Me.Load 4 5 End Sub 6End Class
###現状の結果
‘‘‘asp
<% If Request.QueryString("so") = "123" Then %>
<%@ Register Tagprefix = "win1" Tagname="NaviHeader" Src="/123.ascx" %>/321.ascx" %>
<% Else %>
<%@ Register Tagprefix = "win2" Tagname="NaviHeader" Src="
<% End If %>
‘‘‘
のIF文がまったく動作せず
"/123.ascx"の内容、"/321.ascx"の内容が両方書き出されています。
html
1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 5 <meta charset="utf-8" /> 6 <title>2020</title> 7 </head> 8 <body> 9 <form runat="Server"> 10 <!--メインコンテンツ--> 11 123<!--123.ascxの内容--> 12 321<!--321.ascxの内容--> 13 </form> 14 </body> 15</html>
###もしかしたらできないことなのかも。
以下のサイトを見ていて
ASP.NET ページのページはどこから派生しているか?
リンク内容
Default.aspx→Default.aspx.vbの順番で処理させるとのことで記述がありました。
そのため、簡単ではないのかと想像してしました。
補足情報(FW/ツールのバージョンなど)
FW:4.6.2
win:10
IIS
VB
ビジュアルスタジオ2015
質問を見ていただきありがとうございます。
お分かりになる方いらっしゃいましたらよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー