- PR -

リピーターコントロールの使用

投稿者投稿内容
newborn
常連さん
会議室デビュー日: 2005/04/28
投稿数: 34
お住まい・勤務地: JAPAN
投稿日時: 2006-10-16 12:04
【環境 vs2005, ASP.NET, C# ,SQL Server 2005】

こんにちわ、お世話になります。

本日皆様のお知恵を拝借したく投稿させていただきました。
リピータコントロールのItemTemplateにID値のフィールドとイメージボタンとテキストフィールドがあった場合に、イメージボタンのPostBackUrlにテキストフィールドに
入力された値を渡すことは可能なのでしょうか。

postBackUrl=<%# string.Format("~/ShoppingCart.aspx?id={0}&suuryou={1}", Eval("Id"),???) %>

上記???の部分にテキストフィールドで入力されった値を代入したいのですが、方法が分からずに困っております。
そもそもPostBackUrlに動的に入力されたテキストフィールドの値が代入できないようにも思うのですが…

何卒宜しくお願いいたします。



どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-10-16 12:48
テキストフィールドに入れられた値は一度サーバに送られないことには
PostBackUrlにセットすることはできないと思います。
それをやるぐらいならサーバ上で送られてきたテキストフィールドを元に
リダイレクトするとかしたほうがよさそうですが。
newborn
常連さん
会議室デビュー日: 2005/04/28
投稿数: 34
お住まい・勤務地: JAPAN
投稿日時: 2006-10-16 13:24
どっとねっとふぁん様、
お早い、ご返信ありがとうございます。

>それをやるぐらいならサーバ上で送られてきたテキストフィールドを元に
>リダイレクトするとかしたほうがよさそうですが。

上記の方法で、プログラムを修正する場合,

イメージボタンのタに onClick="myImageButton_onClick"を追加し、
postBackUrlの記述を削除しました。


スクリプトの方に下記のメソッドを追加しました。

protected void myImageButton_onClick(Object sender, EventArgs e)
{
Response.Redirect("http://www.yahoo.co.jp");

}

実行すると次のようなエラーが発生してしまいます。

無効なポストバックまたはコールバック引数です。イベントの検証は、構成の <pages enableEventValidation="true"/>、またはページの <%@ Page EnableEventValidation="true" %> を使用して有効にされます。セキュリティの目的により、この機能は、イベントをポストバックまたはコールバックする引数が、それらを最初に表示したサーバー コントロールから発行されていることを確認します。データが有効であり、予期されている場合、検証のためのポストバックまたはコールバック データを登録するために ClientScriptManager.RegisterForEventValidation メソッドを使用してください。

上記のエラーについて、調査してみましたがどこが原因となっているのか
判別できずに困っております。

何卒宜しくお願いいたします。

どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-10-16 13:44
ASP.NET 2.0ではテキストボックスの内容について自動的にセキュリティのチェックが入ります。
テキストボックスに入れた値によってこのエラーが発生する場合と発生しない場合があると思います。
仕様上このセキュリティチェックをはずしたい場合はPageディレクティブにEnableEventValidation="false"を追加してください。
ただし、この場合セキュリティが甘くなっているので自前でチェックを行う必要があると考えてください。
newborn
常連さん
会議室デビュー日: 2005/04/28
投稿数: 34
お住まい・勤務地: JAPAN
投稿日時: 2006-10-16 14:39
どっとねっとふぁん様、
ご返信ありがとうございます。

enableEventValidationですが、web.configの pagesのタグにenableEventValidation="false"を追加しました所、先ほどのエラーは
発生しなくなりました。

>自前でチェックを行う必要があると考えてください。

実際に、上記チェックを行うにはどのようにすればよろしいのでしょうか。
本当に、何でも伺ってずうずうしいのは承知なのですが、宜しくお願いいたします。


あとは、repeaterコントロールのIDのフィールドとテキストフィールドの
値をクエリーストリングで渡す事ができれば、私の行いたい事が実現できそう
なのですが、下記のメソッド内でリピーターの何行目のimageButtonがクリックされた事を判別するには、どのように記述すればよろしいのでしょうか。

protected void myImageButton_onClick(Object sender, EventArgs e)
{
 Response.Redirect("~/ShoppingCart.aspx?id="+itemId+ "&suuryou="+suuryou);

}

何でも質問して、申し訳ないのですが、問題解決までご協力いただけますと
大変助かります。

宜しくお願いいたします。


どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-10-16 15:19
> 実際に、上記チェックを行うにはどのようにすればよろしいのでしょうか。

どのようなデータを必要としているのか、そしてそのデータを扱うことで
どういったセキュリティ的な問題があるかによってチェックの内容は変わります。
もしテキストボックスに数量のデータしか入らないようであれば、enableEventValidationを
falseにする必要もないはずです。
このあたりはアプリケーションの仕様とそこに存在するセキュリティ上の
脅威によって変わりますので、アプリケーションに合わせた実装をしてください
としか言いようがありません。

> 下記のメソッド内でリピーターの何行目のimageButtonがクリックされた事を
> 判別するには、どのように記述すればよろしいのでしょうか。

ボタンからデータを受け取るには、私だったらItemCommandイベントを利用するかな?
リピータの中のテキストボックスの値をとりだすというのは今までやったことないので
回答できないです。
newborn
常連さん
会議室デビュー日: 2005/04/28
投稿数: 34
お住まい・勤務地: JAPAN
投稿日時: 2006-10-16 17:53
どっとねっとふぁん様、
お世話になっております。

自分なりに色々とためしてみたのですが、なかなかうまくいかずに参っております。

>ボタンからデータを受け取るには、私だったらItemCommandイベントを利用するかな?

このヒントをもとにイメージボタンのonItemCommandで以下のメソッドを呼び出すようにしました。また、commandArgumentでその列のitemIdを渡すようにしました。
その渡された引数のitemIdをもとに、リピーターの列のitemIdでマッチングをかけて、どの行のボタンが押されたか判別し、その行の数量のテキストボックスの値を取り出そうとした。ですが、テキストボックスの値が動的に入力された値ではなく、初期表示時の規定値の1としか取り出せません。


protected void on_Command(object source, System.Web.UI.WebControls.CommandEventArgs e)
{
int itemId = System.Int32.Parse(e.CommandArgument.ToString());

foreach (RepeaterItem row in itemsGrid.Items)
{

HiddenField hd=(HiddenField)row.FindControl("hiddenId");
int hiddenId=System.Int32.Parse(hd.Value.ToString());

if (itemId == hiddenId)//itemのidが一致する列を探す
{
TextBox tb = (TextBox)row.FindControl("quantityText");
int quantity = System.Int32.Parse(tb.Text.ToString());
}
}
}

何か根本的に間違っているような気もしますが、何か私が見落としている点
がありましたが、ご指摘いただけますと大変助かります。

どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-10-16 23:02
やってみないとわからない、ということで試してみました。

RepeaterのItemCommandイベントを利用します。
この場合RepeaterCommandEventArgsが使えるので、e.Itemでボタンを押したセル(?)
の内容を取り出すことができます。
たとえばTextBoxのIDを"TextBox1"としておくと次のようにしてテキストボックスの
内容が取り出せます。

this.Label1.Text = ((TextBox)e.Item.FindControl("TextBox1")).Text;

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