トップ回答者
Literalに挿入して生成したリンクボタンやハイパーリンクがクリッカブルにならない件

質問
-
お世話になります。
ファイルをアップロードすると、Literal1にそのファイルへのショートカットリンクが作成されて、クリックするとダウンロードもできるようなページを作ろうとしているのですがクリックできる状態になりません。どこが悪いのかサンプルのページを作成しましたので教えていただけないでしょうか?いろいろと試したのですがうまくできません。
よろしくお願いします。
upload.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="upload.aspx.vb" Inherits="upload" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>無題のページ</title>
</head>
<body>
<form id="Form1" method="post" runat="server" enctype="multipart/form-data">
<P>送信するファイルを指定して、[送信]ボタンを押してください。</P>
<P><INPUT type="file" name="userfile"><asp:Button id="Button1" runat="server" Text="送信" />
</P>
<P>
<asp:Literal ID="Literal1" runat="server"></asp:Literal>
</P></form>
</body>
</html>
upload.aspx.vb
Partial Class upload
Inherits System.Web.UI.PageProtected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim posted As HttpPostedFile = Request.Files("userfile")
If Not posted.FileName = "" Then
posted.SaveAs( _
"C:\Inetpub\wwwroot\VBNET2\Uploadedfiles\" _
& System.IO.Path.GetFileName(posted.FileName))
Literal1.Text = "<asp:LinkButton ID=" & """" & "LinkButton1" & """" & " Runat=" & """" & "Server" & """" & " PostBackUrl=" & """" & "~/Uploadedfiles/" & System.IO.Path.GetFileName(posted.FileName) & """" & ">" & System.IO.Path.GetFileName(posted.FileName) & "</asp:LinkButton>"
End If
End Sub
End Class
回答
-
たぶん、<asp:LinkButton で始まる文字列が表示されているのではないかと思います。<asp:LinkButton のようなタグはブラウザでは解釈できません。あくまでサーバー側で解釈し、その結果をHTMLに変換してブラウザに送り出します。つまり、<asp:LinkButtonのようなタグをブラウザに送り出してもブラウザは単なる文字列としか認識しません。
PlaceHolderにLinkButtonを追加するようにして下さい。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/ -
Literalコントロールは、そのTextプロパティにセットされた文字列をそのまま表示します。(正確にはModeプロパティによります)
PlaceHolderにコードでコントロールを追加するというのは、デザイン時にそこにその追加したコントロールがあったと考えることができます。
したがって、
Li.Text = "<a href='UploadedFiles/" + System.IO.Path.GetFileName(posted.FileName) + "'>" + System.IO.Path.GetFileName(posted.FileName) + "</a>"
PlaceHolder1.Controls.Add(Li)
のようにしなければなりません。
#であれば、SurferOnWwwさんが指摘されているように最初からLiteralコントロールを配置し、そのTextプロパティに"<a href=・・・・"をセットすればいいんですけどね。(^^; 私が勘違いをしていて、LinkButtonを動的に追加されたいのかと思い、PlaceHolderの話を出しました。すみません。
単にハイパーリンクを表示させたいだけであれば、SurferOnWwwさんの方法で十分でしょう。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク 高橋 春樹 2009年12月16日 6:47
すべての返信
-
たぶん、<asp:LinkButton で始まる文字列が表示されているのではないかと思います。<asp:LinkButton のようなタグはブラウザでは解釈できません。あくまでサーバー側で解釈し、その結果をHTMLに変換してブラウザに送り出します。つまり、<asp:LinkButtonのようなタグをブラウザに送り出してもブラウザは単なる文字列としか認識しません。
PlaceHolderにLinkButtonを追加するようにして下さい。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/ -
trapemiyaさま
いつもありがとうございます。
SuferOnWwwさんの助言に従ってタグを変えるとうまくいったのですが、勉強のために、PlaceHolderでもコントロールを追加してやってみました。
Link = New LinkButton
Link.ID = "LinkButton1"
Link.Text = System.IO.Path.GetFileName(posted.FileName)
Link.PostBackUrl = "uploadedfiles/" & Server.UrlEncode(System.IO.Path.GetFileName(posted.FileName))
PlaceHolder1.Controls.Add(Link)
クリックできるようになり、クリックすると開くアドレスはあっているのですが、The page cannot be displayedとなってしまいます。
生成されたリンクのショートカットを見てみるとこのようになっていました。
javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("LinkButton1", "", false, "", "uploadedfiles/iphone_quickstart.pdf", false, true))
どこか間違っているのでしょうか?
よろしくお願いします。 -
ありがとうございます。
このようにLiteralをPlaceholderに追加するように書き換えて実行してみると一番最初の現象と同じでクリックできるようになりませんでした。
PlaceholderにLiteralを追加する場合もHTMLエンコードされた後のタグ形式にする必要があるようです。
Li = New Literal
Li.Text = "<asp:LinkButton ID=" & """" & "LinkButton1" & """" & " Runat=" & """" & "Server" & """" & " PostBackUrl=" & """" & "~/Uploadedfiles/" & System.IO.Path.GetFileName(posted.FileName) & """" & ">" & System.IO.Path.GetFileName(posted.FileName) & "</asp:LinkButton>"
PlaceHolder1.Controls.Add(Li)
よろしくおねがいします。 -
Literalコントロールは、そのTextプロパティにセットされた文字列をそのまま表示します。(正確にはModeプロパティによります)
PlaceHolderにコードでコントロールを追加するというのは、デザイン時にそこにその追加したコントロールがあったと考えることができます。
したがって、
Li.Text = "<a href='UploadedFiles/" + System.IO.Path.GetFileName(posted.FileName) + "'>" + System.IO.Path.GetFileName(posted.FileName) + "</a>"
PlaceHolder1.Controls.Add(Li)
のようにしなければなりません。
#であれば、SurferOnWwwさんが指摘されているように最初からLiteralコントロールを配置し、そのTextプロパティに"<a href=・・・・"をセットすればいいんですけどね。(^^; 私が勘違いをしていて、LinkButtonを動的に追加されたいのかと思い、PlaceHolderの話を出しました。すみません。
単にハイパーリンクを表示させたいだけであれば、SurferOnWwwさんの方法で十分でしょう。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク 高橋 春樹 2009年12月16日 6:47
-