none
Literalに挿入して生成したリンクボタンやハイパーリンクがクリッカブルにならない件 RRS feed

  • 質問

  • お世話になります。
    ファイルをアップロードすると、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.Page

        Protected 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

    2009年12月9日 7:15

回答

  • たぶん、<asp:LinkButton で始まる文字列が表示されているのではないかと思います。<asp:LinkButton のようなタグはブラウザでは解釈できません。あくまでサーバー側で解釈し、その結果をHTMLに変換してブラウザに送り出します。つまり、<asp:LinkButtonのようなタグをブラウザに送り出してもブラウザは単なる文字列としか認識しません。

    PlaceHolderにLinkButtonを追加するようにして下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答の候補に設定 Jitta 2009年12月10日 14:36
    • 回答としてマーク 高橋 春樹 2009年12月16日 5:53
    2009年12月9日 9:09
    モデレータ
  • Literal コントロールを使う場合は、以下のようにブラウザが解釈可能なタグを出力すれば可能です。

    Literal1.Text = "<a href='UploadedFiles/" + filename + "'>" + filename + "</a>";

    上記で filename はアップロードしたファイル名です。

    2009年12月9日 15:02
  • ポストバックする必要が無いようですので、PlaceHolderにLiteralコントロールを追加すれば良いと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年12月10日 4:34
    モデレータ
  • 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月10日 8:56
    モデレータ

すべての返信

  • たぶん、<asp:LinkButton で始まる文字列が表示されているのではないかと思います。<asp:LinkButton のようなタグはブラウザでは解釈できません。あくまでサーバー側で解釈し、その結果をHTMLに変換してブラウザに送り出します。つまり、<asp:LinkButtonのようなタグをブラウザに送り出してもブラウザは単なる文字列としか認識しません。

    PlaceHolderにLinkButtonを追加するようにして下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答の候補に設定 Jitta 2009年12月10日 14:36
    • 回答としてマーク 高橋 春樹 2009年12月16日 5:53
    2009年12月9日 9:09
    モデレータ
  • Literal コントロールを使う場合は、以下のようにブラウザが解釈可能なタグを出力すれば可能です。

    Literal1.Text = "<a href='UploadedFiles/" + filename + "'>" + filename + "</a>";

    上記で filename はアップロードしたファイル名です。

    2009年12月9日 15:02
  • SurferOnWwwさま
    いつもお世話になります。
    Literal1.Text = "<a href='UploadedFiles/" + System.IO.Path.GetFileName(posted.FileName) + "'>" + System.IO.Path.GetFileName(posted.FileName) + "</a>"
    とするとLiteral1でも確かにうまくできました。

    ありがとうございました。
    2009年12月10日 3:48
  • 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))

    どこか間違っているのでしょうか?

    よろしくお願いします。

    2009年12月10日 3:56
  • ポストバックする必要が無いようですので、PlaceHolderにLiteralコントロールを追加すれば良いと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年12月10日 4:34
    モデレータ
  • ありがとうございます。
    このように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)

    よろしくおねがいします。
    2009年12月10日 5:02
  • 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月10日 8:56
    モデレータ
  • とりあえず、ブラウザーで、生成された HTML を見ましょう。
    trapemiyaさんの最初の返信を理解していれば、この質問はなかったはずです。コピペするのではなく、理解しましょう。→参考:ググるな危険(atmarkit.co.jp)
    Jitta@わんくま同盟
    2009年12月10日 14:40
  • こんにちは、フォーラムオペレーターの高橋春樹です。

    trapemiyaさん、Jittaさん、SurferOnWwwさん、いつもお世話になっております。

    tosaito3さん、初めまして。
    MSDNフォーラムのご利用ありがとうございます。
    皆様からのアドバイスが、参考になったようで良かったです。
    問題解決したようなので、大丈夫だと思いますが、皆様からの投稿が有用な情報だと思いましたので、
    勝手ながら、回答マークを付けさせて貰いました。

    今後ともMSDNフォーラムをよろしくお願いします(^_^)


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2009年12月16日 6:16
  • trampemiyaさま
    ありがとうございます。

    理解していたつもりですが、PlaceHolderにコントロールを追加すれば、HTMLエンコードする前のタグ(、<asp:LinkButton)でもよいのかと勝手に勘違いしてしまいました。

    いろいろと勉強になります。

    ありがとうございました。

    2009年12月17日 7:46