C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: context.request.paramsについて


(過去ログ 170 を表示中)

[トピック内 18 記事 (1 - 18 表示)]  << 0 >>

■97922 / inTopicNo.1)  context.request.paramsについて
  
□投稿者/ とまと (1回)-(2021/08/09(Mon) 18:21:36)

分類:[ASP.NET (VB)] 

はじめまして、宜しくお願いします。

ASP.NETでシステムを作成しています。
JavaScriptからajaxでhandler.ashxにデータを送って、context.request.params()で受け取っています。
そのデータを受け取る際に、何故か勝手に配列になってしまいます。

ネットだ検索をかけては見ましたが、検討もつかず行き詰まっております。

何か原因となるものはあるのでしょうか?
分かる方教えていただけると嬉しいです。
引用返信 編集キー/
■97927 / inTopicNo.2)  Re[1]: context.request.paramsについて
□投稿者/ WebSurfer (2314回)-(2021/08/10(Tue) 06:56:45)
No97922 (とまと さん) に返信

> JavaScriptからajaxでhandler.ashxにデータを送って、context.request.params()で受け取っています。
> そのデータを受け取る際に、何故か勝手に配列になってしまいます。

何が問題なのですか? 配列であろうと他の形式であろうと、web サーバーが必要なデータを受け取れるなら、処理に必要なように加工すれば済むと思うのですが?

そういう話ではないと言うことなら、そもそものやりたいことを書いてください。クライアント側で何をどのような形で web サーバーに送信したいのか、web サーバー側ではそれをどのように受け取って処置したいのか。
引用返信 編集キー/
■97928 / inTopicNo.3)  Re[2]: context.request.paramsについて
□投稿者/ とまと (2回)-(2021/08/10(Tue) 09:00:12)
No97927 (WebSurfer さん) に返信

> 何が問題なのですか? 配列であろうと他の形式であろうと、web サーバーが必要なデータを受け取れるなら、処理に必要なように加工すれば済むと思うのですが?
>
> そういう話ではないと言うことなら、そもそものやりたいことを書いてください。クライアント側で何をどのような形で web サーバーに送信したいのか、web サーバ>ー側ではそれをどのように受け取って処置したいのか。

ご返信ありがとうございます。

現状、クライアント側で例えば「"a"」または「"14"」とサーバー側に送信したとして、サーバー側で送信したデータを確認すると「"a,a"」または「"14,14"」と入ってしまい、何故か配列になっている状態です。
その原因が何なのか分からず、行き詰っております。

もし解決が難しいようであればサーバー側で加工して「"a,a"」または「"14,14"」を「"a"」または「"14"」にできれば問題はないと考えています。
ですが、このやり方が分からなかったので、主題の問題を解決したいと思っていました。
引用返信 編集キー/
■97929 / inTopicNo.4)  Re[3]: context.request.paramsについて
□投稿者/ WebSurfer (2315回)-(2021/08/10(Tue) 09:21:07)
No97928 (とまと さん) に返信

情報不足です。回答者の想像力に期待しないできちんと情報を書いてください。

> 現状、クライアント側で例えば「"a"」または「"14"」とサーバー側に送信したとして、

それはどのようにしたのですか? 送信するデータをどのように取得したのか、クライアント
スクリプトのコードがどうなっているか書いてください。

> サーバー側で送信したデータを確認すると「"a,a"」または「"14,14"」と入ってしまい、
> 何故か配列になっている状態です。

なんでそれが「配列」だと思うのですか?

それはともかくとして、ashx 側でそれらをどのように取得してどのように確認したのか、
質問者さんが書いたコードを提示して説明してください。

引用返信 編集キー/
■97930 / inTopicNo.5)  Re[4]: context.request.paramsについて
□投稿者/ とまと (3回)-(2021/08/10(Tue) 09:49:00)
No97929 (WebSurfer さん) に返信

> それはどのようにしたのですか? 送信するデータをどのように取得したのか、クライアント
> スクリプトのコードがどうなっているか書いてください。

*** Javascript1 ***

$(function () {
    var clickSave = function (e) {
        var formData = new FormData($form[0]);
        var target = {
            Cmn_ScreenName: 'MarcheEntry',
            Cmn_FunctionName: $('#Hf_TargetId').val() ? 'Update' : 'Register'
        };
        var param = $.extend(target, getParam());

        $.each(param, function (index, val) {
            formData.append(index, val);
        });

        //Javascript2共通関数取得
        sendFileToServer(formData, successRegFunc, function (res) { console.log("failure"); });
    };
    $("#保存ボタン").on('click', function () {
        $form = $(this).parents('form:first');
        showConfirm(GetMessage("CCom001", new Array("画面")), clickSave);
    });
});

function getParam() {
    var param = {
        Hf_TargetId: $("#Hf_TargetId").val(),
        Txt_Marche: $("#Txt_Marche").val()
    };
    return param;
}

*** Javascript2(共通関数) ***
function sendFileToServer(formData, successFunc, failureFunc) {
    var uploadURL = "../Common/Cmn_Handler.ashx"; //Upload URL
    var jqXHR = $.ajax({
        url: uploadURL,
        type: "POST",
        contentType: false,
        processData: false,
        cache: false,
        async: false,
        data: formData,
        dataType: 'html',
        success: function (data) {
            var response = JSON.parse(data);

            var d = $("#dialog").dialog({ autoOpen: false });

            if (response.Messages) {
                d.html(response.Messages.join("<br>"));

                d.dialog({
                    modal: true,
                    title: response.Title,
                    width: 450,
                    buttons: {
                        "確認": function () {
                            $(this).dialog("close");

                            if (response.Result) {
                                if (successFunc) {
                                    successFunc(response);
                                }
                            } else {
                                if (failureFunc) {
                                    failureFunc(response);
                                }
                            }
                        }
                    }

                });
                d.dialog("open");
            }
            else {

                if (response.Result) {
                    if (successFunc) {
                        successFunc(response);
                    }
                } else {
                    if (failureFunc) {
                        failureFunc(response);
                    }
                }
            }
        },
        error: function (data) {
            var d = $("#dialog").dialog({ autoOpen: false });
            d.html("サーバ接続時にエラーが発生しました <br>");
            d.dialog({
                modal: true,
                title: "接続エラー",
                width: 450,
                buttons: {
                    "確認": function () { $(this).dialog("close"); }
                }

            });
            d.dialog("open");

        }
    });

> なんでそれが「配列」だと思うのですか?

すみません、単純にカンマ区切りでしたので配列だと思っていました…。

> それはともかくとして、ashx 側でそれらをどのように取得してどのように確認したのか、
> 質問者さんが書いたコードを提示して説明してください。

    Private Function dataEntry(ByVal Context As HttpContext, ByVal FunctionName As String) As AjaxResponse
        '返却用
        Dim Response As New AjaxResponse
        Response.Result = False

        Dim Cnt_dataAs New Cnt_data
        Dim targetId As String = Nothing
        Dim isSuccess As Boolean = False
        Dim retDic As New Dictionary(Of String, String)

        Try
            '処理名で処理を振り分け
            Select Case FunctionName
                Case Cmn_Const.FUNC_REGISTER, Cmn_Const.FUNC_UPDATE

                    Dim data As String = Context.Request.Params("Hf_TargetId")
                    Dim Txtdata As String = Context.Request.Params("Txt_Marche")
            End Select

        Catch ex As Exception
            log.Error(ex.Message)
            Response.Result = False
            Response.Messages = New List(Of String)(New String() {ex.Message})
        End Try
        Return Response
    End Function 



長文になってしまいすみません。
宜しくお願い致します。

引用返信 編集キー/
■97931 / inTopicNo.6)  Re[5]: context.request.paramsについて
□投稿者/ WebSurfer (2316回)-(2021/08/10(Tue) 10:23:54)
No97930 (とまと さん) に返信

> Dim data As String = Context.Request.Params("Hf_TargetId")
> Dim Txtdata As String = Context.Request.Params("Txt_Marche")

それの data と Txtdata がそれぞれ "a,a" および "14,14" になる、取得したいの
は "a" および "14" だとと言ってますか?

実際に "a,a" および "14,14" を送信しているのだとしか思えないですが、そのあ
たりは確認しているのですか? Fiddler などのキャプチャツールを使って調べてく
ださい。

引用返信 編集キー/
■97932 / inTopicNo.7)  Re[6]: context.request.paramsについて
□投稿者/ とまと (4回)-(2021/08/10(Tue) 10:33:20)
No97931 (WebSurfer さん) に返信

> それの data と Txtdata がそれぞれ "a,a" および "14,14" になる、取得したいの
> は "a" および "14" だとと言ってますか?

はい、その通りです。

> 実際に "a,a" および "14,14" を送信しているのだとしか思えないですが、そのあ
> たりは確認しているのですか? Fiddler などのキャプチャツールを使って調べてく
> ださい。

Javascript1のvar param...にブレークポイントをあてて確認はしてみましたが
その時点では「Hf_TargetId:"14"」「Txt_Marche:"a"」ときちんと渡したいデータは入っていました。

Fiddler などのキャプチャツールを使用したことがないので調べながらやってみます。
引用返信 編集キー/
■97933 / inTopicNo.8)  Re[7]: context.request.paramsについて
□投稿者/ WebSurfer (2317回)-(2021/08/10(Tue) 11:31:35)
No97932 (とまと さん) に返信

> Fiddler などのキャプチャツールを使用したことがないので調べながらやってみます。

ブラウザからサーバーに送信される時に空中(?)で 送信データに ",a" とか ",14" がくっつくなんて
ことはあり得ないし、サーバーが受信した後 ASP.NET が勝手にくっつけることもあり得ません。

なので、ブラウザから出た時点で "a,a" とか "14,14" になっていることをまず第一に疑うべきでは?

そこを Fiddler などのキャプチャツールで調べないと話が始まりませんよ。
引用返信 編集キー/
■97934 / inTopicNo.9)  Re[7]: context.request.paramsについて
□投稿者/ 古谷 (5回)-(2021/08/10(Tue) 13:07:38)
No97932 (とまと さん) に返信

paramが問題ないとするならformDataの方じゃないかな

> var formData = new FormData($form[0]);
> var target = {
> Cmn_ScreenName: 'MarcheEntry',
> Cmn_FunctionName: $('#Hf_TargetId').val() ? 'Update' : 'Register'
> };
> var param = $.extend(target, getParam());
>
> $.each(param, function (index, val) {
> formData.append(index, val);
> });

new FormData($form[0])ですでに値がセットされているとするなら
formData.appendで二重に値がセットされるような気がする
引用返信 編集キー/
■97935 / inTopicNo.10)  Re[8]: context.request.paramsについて
□投稿者/ とまと (5回)-(2021/08/10(Tue) 13:36:05)
No97933 (WebSurfer さん) に返信

> ブラウザからサーバーに送信される時に空中(?)で 送信データに ",a" とか ",14" がくっつくなんて
> ことはあり得ないし、サーバーが受信した後 ASP.NET が勝手にくっつけることもあり得ません。
> なので、ブラウザから出た時点で "a,a" とか "14,14" になっていることをまず第一に疑うべきでは?

そうなんですね…。

> そこを Fiddler などのキャプチャツールで調べないと話が始まりませんよ。

Fiddlerをダウンロードし設定までしたのですが使用方法がいまいち分かりません。
参考となるURLなどはありますでしょうか?
引用返信 編集キー/
■97936 / inTopicNo.11)  Re[8]: context.request.paramsについて
□投稿者/ とまと (6回)-(2021/08/10(Tue) 13:37:06)
No97934 (古谷 さん) に返信

> paramが問題ないとするならformDataの方じゃないかな
>
>>var formData = new FormData($form[0]);
>>var target = {
>> Cmn_ScreenName: 'MarcheEntry',
>> Cmn_FunctionName: $('#Hf_TargetId').val() ? 'Update' : 'Register'
>>};
>>var param = $.extend(target, getParam());
>>
>>$.each(param, function (index, val) {
>> formData.append(index, val);
>>});
>
> new FormData($form[0])ですでに値がセットされているとするなら
> formData.appendで二重に値がセットされるような気がする

ご回答ありがとうございます。
ソースを再度確認してみます。

引用返信 編集キー/
■97937 / inTopicNo.12)  Re[9]: context.request.paramsについて
□投稿者/ WebSurfer (2318回)-(2021/08/10(Tue) 14:29:09)
No97935 (とまと さん) に返信

> Fiddlerをダウンロードし設定までしたのですが使用方法がいまいち分かりません。
> 参考となるURLなどはありますでしょうか?

何でもかんでも人に聞かないで「Fiddler 使い方」などをキーワードにググってみよう。
引用返信 編集キー/
■97938 / inTopicNo.13)  Re[10]: context.request.paramsについて
□投稿者/ ???? (1回)-(2021/08/10(Tue) 15:24:25)
2021/08/10(Tue) 15:25:39 編集(投稿者)

No97937 (WebSurfer さん) に返信

名前を書き忘れていました。とまとです。

> 何でもかんでも人に聞かないで「Fiddler 使い方」などをキーワードにググってみよう。

何とか実行できてやり方が合っているか分かりませんが、Valueには"a" とか "14"が入っていました。
ですが、「Content-Disposition:from-data;name="Hf_TargetId"」と「Content-Disposition:from-data;name="Txt_Marche"」が
二つずつあったのですがこれが原因でしょうか?

引用返信 編集キー/
■97939 / inTopicNo.14)  Re[11]: context.request.paramsについて
□投稿者/ WebSurfer (2319回)-(2021/08/10(Tue) 15:51:15)
No97938 (???? さん) に返信

???? さん=とまとさん ですか?

> 何とか実行できてやり方が合っているか分かりませんが、Valueには"a" とか "14"が入っていました。
> ですが、「Content-Disposition:from-data;name="Hf_TargetId"」と「Content-Disposition:from-data;name="Txt_Marche"」が
> 二つずつあったのですがこれが原因でしょうか?

何を言っているのか不明ですが、多分見てるところが違うと思います。

データは multipart/form-data 形式でフォームに含めて送信されるはずなので、それを
見ないとダメだと思うのですが。
引用返信 編集キー/
■97940 / inTopicNo.15)  Re[12]: context.request.paramsについて
□投稿者/ とまと (7回)-(2021/08/10(Tue) 16:06:29)
No97939 (WebSurfer さん) に返信

> ???? さん=とまとさん ですか?

すみません、名前を書かずに投稿してしまいました。
???? = とまと です。

> 何を言っているのか不明ですが、多分見てるところが違うと思います。
>
> データは multipart/form-data 形式でフォームに含めて送信されるはずなので、それを
> 見ないとダメだと思うのですが。

Content-Type: multipart/form-data is not yet full supported. ですか?
その下がリストになっていて、Nameの列とValueの列がある画面じゃないのでしょうか?
引用返信 編集キー/
■97941 / inTopicNo.16)  Re[11]: context.request.paramsについて
□投稿者/ WebSurfer (2320回)-(2021/08/10(Tue) 16:38:56)
No97938 (???? さん) に返信

話が通じなくてラチがあかないので、ここまで書けばわかるだろうということを書いておきます。

以下のコードで[POST] ボタンをクリックすると、質問者さんがやったのとほぼ同様に jQuery ajax
を使って 2 つのテキストボックスの value が送信されます。value に "a", "14" が設定済みなのに
注意。fd.append(...) がコメントアウトしてあるところにも注意。

<%@ Page Language="C#" AutoEventWireup="true" 
    CodeBehind="WebForm20.aspx.cs" 
    Inherits="WebApplication1.WebForm20" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <script src="Scripts/jquery-3.4.1.js"></script>
    <script type="text/javascript">
        //<![CDATA[
        $(function () {
            $('#ajaxPost').on('click', function (e) {
                var fd = new FormData(document.querySelector("form"));

                //fd.append("Hf_TargetId", "a");
                //fd.append("Txt_Marche", "14");

                $.ajax({
                    url: '/myapp/ajaxposthandler.ashx',
                    method: 'post',
                    data: fd,
                    processData: false,
                    contentType: false
                }).done(function (response) {
                    $("#result").empty;
                    $("#result").text(response);
                }).fail(function (jqXHR, textStatus, errorThrown) {
                    $("#result").empty;
                    $("#result").text('textStatus: ' + textStatus +
                        ', errorThrown: ' + errorThrown);
                });
            });
        });
        //]]>
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <h1>POST by jQuery ajax</h1>
        <input id="Hf_TargetId" name="Hf_TargetId" type="text" value="a" />
        <input id="Txt_Marche" name="Txt_Marche" type="text" value="14" />
        <input id="ajaxPost" type="button" value="POST" />
        <div id="result"></div>
    </form>
</body>
</html>

Fiddler で要求をキャプチャすると以下のようになります。name が Hf_TargetId および Txt_Marche
の値をみてください。期待通り a と 14 が送信されている点に注目。


POST https://localhost:44364/myapp/ajaxposthandler.ashx HTTP/1.1
Host: localhost:44364
Connection: keep-alive
Content-Length: 563
・・・中略・・・
Accept-Language: ja,en-US;q=0.9,en;q=0.8,de;q=0.7

------WebKitFormBoundarytZhyclsKu5e6ksnm
Content-Disposition: form-data; name="__VIEWSTATE"

5D7jXYvhFvOqzAXeQ9Fhx6EZQH4YNXu1IpYJfdF6lv0e1Co7QhFQvebPCBzep0Gm3poGqNRLkxf/jI1yz2PHo9cupCkPckCVknXSZx8ii10=
------WebKitFormBoundarytZhyclsKu5e6ksnm
Content-Disposition: form-data; name="__VIEWSTATEGENERATOR"

B928ED7D
------WebKitFormBoundarytZhyclsKu5e6ksnm
Content-Disposition: form-data; name="Hf_TargetId"

a
------WebKitFormBoundarytZhyclsKu5e6ksnm
Content-Disposition: form-data; name="Txt_Marche"

14
------WebKitFormBoundarytZhyclsKu5e6ksnm--


上の aspx のコードの fd.append(...) のコメントアウトを解除して同じことを行うと name が
Hf_TargetId および Txt_Marche の部分は以下のようにダブります。


------WebKitFormBoundaryudm7lpE3oJMs1sMc
Content-Disposition: form-data; name="Hf_TargetId"

a
------WebKitFormBoundaryudm7lpE3oJMs1sMc
Content-Disposition: form-data; name="Txt_Marche"

14
------WebKitFormBoundaryudm7lpE3oJMs1sMc
Content-Disposition: form-data; name="Hf_TargetId"

a
------WebKitFormBoundaryudm7lpE3oJMs1sMc
Content-Disposition: form-data; name="Txt_Marche"

14
------WebKitFormBoundaryudm7lpE3oJMs1sMc--


これが、原因でしょう。自信度 99.99% ぐらい。

引用返信 編集キー/
■97942 / inTopicNo.17)  Re[12]: context.request.paramsについて
□投稿者/ とまと (9回)-(2021/08/10(Tue) 17:26:08)
No97941 (WebSurfer さん) に返信
 
> 話が通じなくてラチがあかないので、ここまで書けばわかるだろうということを書いておきます。

> 上の aspx のコードの fd.append(...) のコメントアウトを解除して同じことを行うと name が
> Hf_TargetId および Txt_Marche の部分は以下のようにダブります。
> 
> 
> ------WebKitFormBoundaryudm7lpE3oJMs1sMc
> Content-Disposition: form-data; name="Hf_TargetId"
> 
> a
> ------WebKitFormBoundaryudm7lpE3oJMs1sMc
> Content-Disposition: form-data; name="Txt_Marche"
> 
> 14
> ------WebKitFormBoundaryudm7lpE3oJMs1sMc
> Content-Disposition: form-data; name="Hf_TargetId"
> 
> a
> ------WebKitFormBoundaryudm7lpE3oJMs1sMc
> Content-Disposition: form-data; name="Txt_Marche"
> 
> 14
> ------WebKitFormBoundaryudm7lpE3oJMs1sMc--
> 
> 
> これが、原因でしょう。自信度 99.99% ぐらい。


わざわざご丁寧にありがとうございます。
私がダウンロードしたFidderとは表示の仕方が違うみたいで、伝わりづらくなっていたみたいです。
すみません。

ほぼほぼWebSurferさんと同じでダブっていたのが原因なのかな?とは思っていました。
解決方法は探り中でしたが…。

今まではSite.Masterを使いasp:Contentのなかでデザインしていたため被っていてもnameがctl00$maincontents$Txt_Marche、
IDがTxt_Marchのため、Request.Parames("Txt_March")で取得していたので引っ掛からなかったみたいです。

とりあえず、今まで通りの方針を変更せずに進めたいと考えております。
今後の勉強としてWebSurferさんが提示して頂いたソースを元に勉強したいと思います。

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

解決済み
引用返信 編集キー/
■97943 / inTopicNo.18)  Re[13]: context.request.paramsについて
□投稿者/ WebSurfer (2321回)-(2021/08/10(Tue) 18:26:03)
No97942 (とまと さん) に返信

> 今まではSite.Masterを使いasp:Contentのなかでデザインしていたため被っていてもnameがctl00$maincontents$Txt_Marche、
> IDがTxt_Marchのため、Request.Parames("Txt_March")で取得していたので引っ掛からなかったみたいです。

そこは基本のキなのできちんと考えて対処すべきです。イイカゲンに済ませると後でまた問題が起きるで
しょう、たぶん。

趣味でやってるならどうでも良いかもしれませんが、仕事でやってるならきちんとやってください。大き
なお世話と思うかもしれませんが、あなたが作ったアプリが原因で、ロケットが落ちたりインフラが止ま
ったり・・・というようなことはないにせよ、情報漏洩とか何かで私に被害が及ぶことがないよう祈るば
かりです。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -