質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • C#

    9051questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Visual Studio

    2364questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • ASP.NET

    625questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NETで、特定の条件下でボタンを押したときにポップアップを表示させたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,987

ehyai

score 35

前提・実現したいこと

ASP.NETにおいて、ある条件下において、または条件を達成していないときに、ボタンをクリックしたらポップアップを表示して警告を出すことができる機能を実装したいと考えています。しかし、C#における「MessageBox.Show」の文は使えないため、具体例として書いた以下のようなコードの場合、どのようにコードを追加すればよいかを教えていただきたいのです。

試したこと

最初はこのサイトを参考にして、「Attributes」文を使用しようと考えたのですが、これはPage_Loadメソッド内でしか書くことができないようで、Button内に条件式を書きたいのにその方法が思い付くことができないため、どうにかならないものかと思い尋ねることにしました。お手数ですが、よろしくお願いします。

該当のソースコード

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //最初に試した書き方
     //この箇所に条件式を書いてもうまくいかなかった
        Button1.Attributes["onclick"] = "return confirm('警告文:すでにファイルが存在しています。上書きしてもよろしいですか?');";
    }
    protected void Button1_Click1(object sender, EventArgs e)
    {
        string fileName = @"特定のディレクトリ";
        //ボタンをクリックしたときに、特定のディレクトリの中にすでにファイルが存在している場合にのみ、ポップアップを表示させて警告させたい
        if(System.IO.Directory.Exists(fileName))
        {
       //ポップアップ表示「すでにファイルが存在しています。上書きしてもよろしいですか?」
             //ポップアップで「はい」が選択された場合、すでに存在しているファイルを削除して新たに作り直す
             System.IO.File.Delete(~);
             (fileName内にファイル作成)
        }else//特定のディレクトリの中にファイルがない場合、ポップアップを表示しないままファイルを新たに作る
       (fileName内にファイル作成)
     }


    }

追記

自分が実現させたいと考えている全体的なシナリオを書いておきます。まず、ディレクトリAがあり、その中にディレクトリ①、ディレクトリ②...と複数のディレクトリが存在しています(これらのディレクトリが上記のコードにおける「特定のディレクトリ」のことです)ページ内に表があり、それには列の一番左にディレクトリの名前を示し、1行目=ディレクトリ①、2行目=ディレクトリ②...という風になっています。また、その名前の隣に、それぞれのディレクトリの中身のファイルの名前を表示しています。ディレクトリ①、②~と、ディレクトリの中に作成するファイルを選択してから、Button1を押すと、ファイルを作成され、その際に選択したディレクトリの中にすでにファイルが存在していた場合に、ポップアップで警告を出せるような仕組みを作りたかったのです。わかりづらい説明で申し訳ありません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

クライアント側(ブラウザ)で起こることとサーバー側で起こることの区別がついていないです。

サーバーのどこかのディレクトリにファイルを書き込もうとしていて、書き込む前に同名のファイルの存在を調べ、存在する場合 JavaScript の confirm でユーザーに上書き可否の確認をするという理解でいいのですよね?

であれば、質問者さんの質問は、

具体例として書いた以下のようなコードの場合、どのようにコードを追加すればよいかを教えていただきたいのです。 

ということですが、「コードを追加」というレベルではなくて、ほぼ全面的に書き換えなければなりません。 

JavaScript の confirm でユーザーに上書き可否の確認をするなら、confirm をする前に同名ファイルの有無を調べなければならないということは理解できるでしょうか?

JavaScript はクライアント側で動くのですが、同名ファイルの有無はサーバー側でしか分からないので、confirm する前に、クライアント側から ajax を利用するなどしてサーバーに問合せを出す必要はあるのは理解できるでしょうか?

質問者さんがアップされたコードのはそのあたりのことが全く配慮されていません。上で私が「ほぼ全面的に書き換えなければなりません」と言ったのはそういう意味です。

サーバーに問合せを出す方法の例ですが、質問者さんのケースに当てはまるかどうかは分かりませんが、以下のような方法で実現できます。検討してみてください。

CustomValidator で jQuery.ajax 利用
http://surferonwww.info/BlogEngine/post/2016/10/20/use-jquery-ajax-in-customvalidator-to-check-databese-at-server-side.aspx

局所的な質問だけでなく、全体のシナリオを含めて何がしたいのかを書くことをお勧めします。そうすれば、局所的な質問の部分は実現が無理 or 他にもっと良い方法があるような場合、「それはできない or そのやり方は適切ではないけど、やりたいことはこうすれば実現できる」というような代案も出てくるかもしれません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/17 20:51

    回答してくださってありがとうございます。自分には難しそうな内容みたいですね...クライアントとサーバーの違いなどについてもう少し勉強してから、SurferOnWwwさんの教えてくれたページの方法でやれるか試してみたいと思います。

    キャンセル

  • 2016/12/17 21:14

    上の回答で「局所的な質問だけでなく、全体のシナリオを含めて何がしたいのかを書くことをお勧めします」と書きましたが、それはやる気なしですか? そういう情報を書くと回答がずいぶん変わってくると思いますよ。

    キャンセル

  • 2016/12/17 23:37 編集

    申し訳ありませんでした。追記の欄に、全体のシナリオについての情報を書いておきました。

    キャンセル

  • 2016/12/18 11:40

    > ディレクトリ①、②~と、ディレクトリの中に作成するファイルを選択してから

    そこのところの「ディレクトリの中に作成するファイルを選択」というのが具体的にどういうことなのか分かりませんが、何にせよ、その時点ではブラウザに既存のファイル名一覧が表示されていて、新たに作成するファイルの名前も決まるのですよね?

    であれば、サーバー側に問い合わせなくても、JavaScript / jQuery を使って同名の既存のファイルが存在するかをブラウザ側だけで調べられるはずです。

    なので、Button1 の onclick に、ブラウザ上に表示された既存のファイル一覧に同名のものが存在するかを調べてから confirm するような JavaScript / jQuery のスクリプトを設定すれば目的は果たせるのではないですか?

    初期画面の表示からユーザーが Button1 をクリックするまでに、別のユーザーが新たなファイルを作って、その名前と重複するようなケースまで考えなければならないとすると上記方法ではダメかもしれませんが、そこまで考えなくてもよければ上記の方法を採用してはいかがですか。

    作業中に別のユーザーが作るかもしれない新たなファイルも考える必要があるとすると、サーバー側でファイルを書き込む直前に調べないとダメなので、confirm を使うとかではなくて別の方法を考える必要があると思います。

    キャンセル

  • 2016/12/19 18:58 編集

    詳しいアドバイス、ありがとうございます。今のところは作業中の別のユーザーのファイルの作成などまでは考えていないので、その方法を可能であれば採用してみたいと思います。実現させるために、Button1_Click1内の、同盟のファイルの存在の有無を調べるif文の中に「return confirm('~');」という文を追加してみたのですが、「現在のコンテキストに'confirm'という名前は存在しません。」「文字リテラルに文字が多すぎます」というエラーが発生してしまっています。confirmを行うJavaScript / jQueryのスクリプトの書き方として、このやり方は間違っているでしょうか。

    キャンセル

  • 2016/12/19 23:17

    > このやり方は間違っているでしょうか。

    間違っているかどうか以前に、質問者さんは何も分かってなくて、メチャクチャやっているとしか思えないです。

    もっと勉強して基本的な知識をつけていただかないと、前のスレッドでも言いましたが、掲示板で得られるヒント程度で解決するのは無理です。

    JavaScript / jQuery を勉強して知識をつけてください。それが時間的に許されないなら、サーバー側で解決する方法を考えるほかないです。

    キャンセル

  • 2016/12/21 04:53

    アドバイスありがとうございます。自分にはASP.NETやJavaScriptなどに関する知識が足りないということを思い知らされました。もう少しそれらについて勉強して知識をつけてから、取り組むようにしたいと思います。知識の足りないまま何度も質問してしまい、申し訳ありませんでした。

    キャンセル

+1

そもそもサーバーサイドの処理とクライアントサイドの処理は別物です。
サーバー側で何か判定が必要であればサーバー側で判定した後に、
クライアントに何かの形で判定結果を返却する必要があります。

ボタン押下時にファイルの存在可否の判定をするWebApiを呼び出して、
そのコールバックで処理する方法もありますが、本題からずれるので割愛します。

ファイルが存在した時はButton2で処理をするようにするのもありかなと。
画面側ではcssのdisplayをnoneにして非表示にしたほうが無難です。

Button1を押下したイベント内でButton2を押下するスクリプトを動的に生成して、
実際の処理はButton2のイベントでやれば大丈夫かなと。
ボタンを2回押したことになるのでポストバックが2回走ることになりますが特に問題ないかなと。

protected void Page_Load(object sender, EventArgs e)
{
//画面側で設定するのもあり
Button2.OnClientClick = "return confirm('警告文:すでにファイルが存在しています。上書きしてもよろしいですか?');";

}

protected void Button1_Click1(object sender, EventArgs e)
{
var fileName = @"特定のディレクトリ";

if (System.IO.Directory.Exists(fileName))
{
//Button2を押下させる
ClientScript.RegisterStartupScript(this.GetType(), "key", string.Format("document.getElementById('{0}')", Button1.ClientID, true);

}
else
{
/*
特定のディレクトリの中にファイルがない場合、ポップアップを表示しないままファイルを新たに作る
(fileName内にファイル作成)
*/

}

}

protected void Button2_Click1(object sender, EventArgs e)
{
var fileName = @"特定のディレクトリ";

//ポップアップで「はい」が選択された場合、すでに存在しているファイルを削除して新たに作り直す
System.IO.File.Delete(~);
//(fileName内にファイル作成)

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/17 00:23

    横から失礼します。
    回答の意味が理解できていませんが(はっきり言うと質問者さんの目的は果たせないかと)、とりあえずコードは ``` と ``` で囲っていただけるとインデントされて見やすくなりますので、まずそれをお願いします・

    キャンセル

  • 2016/12/17 20:55 編集

    回答してくださってありがとうございます。Soka_Taisaさんの教えてくれた方法でやれるか試してみたいのですが、cssというものがどこにあるのかがわからなくて...ソリューションエクスプローラーの中に「Site.css」というものがあるのですが、これのことでしょうか?ただ、この中のコードを見てもIDが「Button2」の箇所が見当たらないですね...。

    キャンセル

同じタグがついた質問を見る

  • C#

    9051questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Visual Studio

    2364questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • ASP.NET

    625questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。