- PR -

PostBackが無効化される

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/06/27
投稿数: 13
投稿日時: 2006-09-04 18:22
いつも拝見させて頂いてます。

現在asp.net(vb)で開発をしているのですが、
InputタグのFileフィールドから、ファイル名を取得しようと思っています。
以下のようなJavascriptでファイル名をTextBoxに設定するまでは出来たのですが、
その後他のボタンをクリックしてもPostBackが発生しません。

function fncSelectFile()
{
document.forms['Form1'].elements['File1'].click(); //非表示にしたFileフィールドをクリック
document.forms['Form1'].elements['TextBox1'].value = document.forms['Form1'].elements['File1'].value; //FileフィールドのValueをTextBox(ReadOnly)にセット
}

上記のJavascriptを処理後にボタンAをクリックするとAのイベントは実行されず、
その後でボタンBをクリックするとBのイベントは実行されます。
先にボタンBをクリックするとBのイベントは実行されず、
ボタンAのイベントは実行されます。

通常通りにポストバックを発生させるにはどうしたら良いのか分かりません。
どなたかご存知の方がいらっしゃいましたらご教授願います。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-09-04 19:52
<input type="file" />にname属性があるとそうなるようです。

引用:
document.forms['Form1'].elements['File1'].click(); //非表示にしたFileフィールドをクリック

非表示って何ですか?Visible=falseではないですよね?非表示じゃなくしてみてください。
ポストバックするボタンを押したタイミングでなぜか<input type="file" />の中身も消えています。

そもそもなんでこんな手の込んだことしてるんですか?フルパスを渡したいんですか?
ブラウザはセキュリティのため<input type="file" />ファイル名のフルパスを渡さないように
なってきています。使われ方にもよりますがフルパスがサーバー渡るような実装はよくないと思いますよ。
未記入
会議室デビュー日: 2005/06/27
投稿数: 13
投稿日時: 2006-09-04 20:18
返答ありがとうございます。

Visible=falseではなく、スタイルでDISPLAY=noneを指定しています。
このような方法を取っているのは、ファイルをアップロードせずにファイル名
のみ取得する為です。
通常のFileフィールドだとサーバーにファイルがアップロードされてしまう為、
サイズの大きいファイルを指定するとタイムアウトしてしまいます。

name属性を切ってJSを以下のように変更してもやはりダメでした・・・

function fncSelectFile()
{
var objInput = document.getElementsByTagName('INPUT');
var objRegex = new RegExp("File1");
for(i=0; i < objInput.length; i++){
if(objInput[i].id.match(objRegex)){
objInput[i].click();
document.forms['Form1'].elements['TextBox1'].value = objInput[i].value;
}
}
}
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-09-04 22:08
できたけどなぁ?→ http://blogs.wankuma.com/jitta/archive/2006/03/08/21735.aspx
引用:

通常のFileフィールドだとサーバーにファイルがアップロードされてしまう為、
サイズの大きいファイルを指定するとタイムアウトしてしまいます。


同じ。。。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-09-04 23:19
あ、IE6はフルパス渡しなんでしたね。Firefox 1.5.0.6はファイル名だけ渡しですね。

引用:
Visible=falseではなく、スタイルでDISPLAY=noneを指定しています。
このような方法を取っているのは、ファイルをアップロードせずにファイル名
のみ取得する為です。
通常のFileフィールドだとサーバーにファイルがアップロードされてしまう為、
サイズの大きいファイルを指定するとタイムアウトしてしまいます。

なるほど。そんな使い方もあるんですね。

引用:
name属性を切ってJSを以下のように変更してもやはりダメでした・・・

function fncSelectFile()
{
var objInput = document.getElementsByTagName('INPUT');
var objRegex = new RegExp("File1");
for(i=0; i < objInput.length; i++){
if(objInput[i].id.match(objRegex)){
objInput[i].click();
document.forms['Form1'].elements['TextBox1'].value = objInput[i].value;
}
}
}

あれ、、私のところではできましたけどね。。javascriptを変える必要はなかったです。
runat="server" の書かれていないHtmlコントロールじゃないとだめかもですね。
勝手にname属性が書かれてしまうようですから。ちなみにFireFoxではこのコード動かないんですね。。
がんふぃーるど
ベテラン
会議室デビュー日: 2006/06/05
投稿数: 58
お住まい・勤務地: さいたま
投稿日時: 2006-09-04 23:47
お世話になっております。がんふぃーるどです。

かなりうる覚えなのですが、inputタグのfile型はかなり制約が多かった気がします。
そのうちの一つに、javascriptからfile型のclickメソッドを呼ばれた場合
submitしようとしても、最初だけ(最初のクリック)submitされず、2回目以降しか
submitが働かなかった気がします。しかもfile型のinputタグの値も初期化されてた
気がします。
要するに、javascriptの中からfileuploadのclickメソッドを呼んでいるのが
問題だと思います。

IEだけの問題だったと思うので、IE以外のブラウザでどうなるか試してみると
いいかもしれません。

引用:

通常のFileフィールドだとサーバーにファイルがアップロードされてしまう為、
サイズの大きいファイルを指定するとタイムアウトしてしまいます。


formのenctypeをapplication/x-www-form-urlencodedにしてしまうとか…
multipart/form-dataでないと複数のデータを送信できないはずですが、
あまり汎用的じゃないからダメかな(技巧に懲りすぎ?)。

引用:

あ、IE6はフルパス渡しなんでしたね。


今までフルパスを使用してたWebアプリ(社内アプリとか)困りそうですね…

[ メッセージ編集済み 編集者: がんふぃーるど 編集日時 2006-09-04 23:48 ]
未記入
会議室デビュー日: 2005/06/27
投稿数: 13
投稿日時: 2006-09-05 11:01
ありがとうございます!
runat="server"を取ったら動きました!

でもIE7からはフルパスが取れなくなりますね・・・
もうちょっとがんばってみます。

みなさんありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)