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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

Visual Studio

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

ASP.NET

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

Q&A

解決済

2回答

9152閲覧

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

ehyai

総合スコア43

C#

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

Visual Studio

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

ASP.NET

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

0グッド

0クリップ

投稿2016/12/15 21:01

編集2016/12/17 14:36

###前提・実現したいこと
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を押すと、ファイルを作成され、その際に選択したディレクトリの中にすでにファイルが存在していた場合に、ポップアップで警告を出せるような仕組みを作りたかったのです。わかりづらい説明で申し訳ありません。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

ボタン押下時にファイルの存在可否の判定をする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/16 14:58

Soka_Taisa

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/12/16 15:23

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

2016/12/17 11:55 編集

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

0

ベストアンサー

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

サーバーのどこかのディレクトリにファイルを書き込もうとしていて、書き込む前に同名のファイルの存在を調べ、存在する場合 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/16 02:07

編集2016/12/16 02:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ehyai

2016/12/17 11:51

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

退会済みユーザー

2016/12/17 12:14

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

2016/12/17 14:37 編集

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

退会済みユーザー

2016/12/18 02:40

> ディレクトリ①、②~と、ディレクトリの中に作成するファイルを選択してから そこのところの「ディレクトリの中に作成するファイルを選択」というのが具体的にどういうことなのか分かりませんが、何にせよ、その時点ではブラウザに既存のファイル名一覧が表示されていて、新たに作成するファイルの名前も決まるのですよね? であれば、サーバー側に問い合わせなくても、JavaScript / jQuery を使って同名の既存のファイルが存在するかをブラウザ側だけで調べられるはずです。 なので、Button1 の onclick に、ブラウザ上に表示された既存のファイル一覧に同名のものが存在するかを調べてから confirm するような JavaScript / jQuery のスクリプトを設定すれば目的は果たせるのではないですか? 初期画面の表示からユーザーが Button1 をクリックするまでに、別のユーザーが新たなファイルを作って、その名前と重複するようなケースまで考えなければならないとすると上記方法ではダメかもしれませんが、そこまで考えなくてもよければ上記の方法を採用してはいかがですか。 作業中に別のユーザーが作るかもしれない新たなファイルも考える必要があるとすると、サーバー側でファイルを書き込む直前に調べないとダメなので、confirm を使うとかではなくて別の方法を考える必要があると思います。
ehyai

2016/12/19 09:59 編集

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

退会済みユーザー

2016/12/19 14:17

> このやり方は間違っているでしょうか。 間違っているかどうか以前に、質問者さんは何も分かってなくて、メチャクチャやっているとしか思えないです。 もっと勉強して基本的な知識をつけていただかないと、前のスレッドでも言いましたが、掲示板で得られるヒント程度で解決するのは無理です。 JavaScript / jQuery を勉強して知識をつけてください。それが時間的に許されないなら、サーバー側で解決する方法を考えるほかないです。
ehyai

2016/12/20 19:53

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問