none
エラーメッセージの表示方法 RRS feed

  • 質問

  • いつもお世話になっております。

    言語   = C#
    DB   = SQLServer 2014
    ツール = VS2015 Pro
    開発モデル = MVC

    検索画面があり、検索ボタン押下イベントにてDBに問合せ、
    データが存在していなければポップアップメッセージを表示させたいです。

    ネット検索した際に、
    サーバ側プログラムで存在確認を行い、結果をJavaScliptへ渡してJavaScliptからメッセージを表示させる・・
    と言うのは分りましたが、いくつかサンプルを見よう見まねで試してみても
    メッセージを呼び出すスクリプト※が呼ばれません。
    共通処理である『layout.cshtml』に記載

    そこで、参考になるサイトや具体的な実装方法のサンプル等をご教示頂きたく
    投稿させて頂きます。


    以上、何卒宜しくお願い申し上げます。

    2017年4月28日 23:18

回答

  • 説明しても理解してもらえない気がしますが、一応説明します。これ以上は、参考にされている記事の通り実装して、参考にされている記事の通り動くようになって、その仕組みが十二分に理解できてからにしてください。

    > DB確認を伴った場合、画面遷移するか、ポップアップメッセージ表示後、元の画面に留まるかの処理が
    > JSONPを参考にした場合、無理だという事でしょうか?

    まずポップアップ云々はまったく何の関係もないです。そこにこだわらないで、ひとまずポップアップ云々は忘れてください。

    基本的にはユーザーが正しい情報を入力することを期待しているはずです。なので、[編集]ボタンクリックで編集画面に遷移するというのが普通のシナリオになるはずです。

    しかしながら、[編集]ボタンクリックで、参考にされている記事のように JSONP を利用して検証結果を返すような操作を行った場合、検証 OK の場合に編集画面に遷移するのはどうするのですか?

    何か特別なことをすれば分かりませんが、普通ではできませんよね? それは、JSONP を使う方法でなくても、例えば ajax でアクションメソッドに問い合わせる方法を取っても同じです。

    だから、先のレスで、データアノテーション検証を使うことを検討してくださいと書いたのです。

    または、シナリオを変えて、[確認]ボタンで DB の有無を確認、確認後[編集]ボタンで編集画面に遷移というように 2 段階にするかですね。

    > 下記のケースでは画面遷移は伴いませんが、それだったら可能でしょうか?

    今は考える気がしません。まずは質問者さんが上に書いたことをよく考えて十二分に理解して、その上でどうしても他のシナリオを考えざるを得ないということが説明できてからの話です。

    • 回答としてマーク kong0214 2017年9月15日 7:08
    2017年5月2日 11:11

すべての返信

  • > 検索画面があり、検索ボタン押下イベントにてDBに問合せ、
    > データが存在していなければポップアップメッセージを表示させたいです。

    それだけの情報では具体的なことがほとんど分からないのでハズレかもしれませんが・・・

    (1) 要求を受けて DB に問い合わせ、結果を返す受け口を作る。(MVC ならアクションメソッドでいいと思います。それがダメなら、WCF、Web サービス、Web API 等でもいいです)

    (2) jQuery Ajax などを利用して「検索画面」から非同期で上記 (1) の窓口を呼び出す。

    (3) 窓口から「データが存在しない」という応答を受けたら alert などを使ってメッセージを表示する。

    具体例は受け口が WCF の場合ですが以下の記事を見てください。

    WCF と jQuery AJAX
    http://surferonwww.info/BlogEngine/post/2015/10/15/wcf-and-jquery-ajax.aspx

    上記がハズレの場合は、

    > サーバ側プログラムで存在確認を行い、結果をJavaScliptへ渡してJavaScliptから
    > メッセージを表示させる・・
    > と言うのは分りましたが、いくつかサンプルを見よう見まねで試してみても
    > メッセージを呼び出すスクリプト※が呼ばれません。

    ・・・というところで、どのようなことを期待して、自分ではどのように実装したのか、「見よう見まねで試して」のコードをアップしてください。そうしてもらえると質問者さんのやりたいことがより具体的に分かるのではないかと思います。

    2017年4月29日 2:27
  • いつもお世話になっております。

    参考リンク有難う御座います。
    ただ、MVCなのでアクションメソッドでやらせて下さい。
    その中で、非同期で呼出すとありますが、仕組み上必要であるならば
    まずはそこが出来ておりません。

    参考にしたサイトは下記の通りです。
    http://www.atmarkit.co.jp/ait/articles/0907/10/news109_5.html

    上記をまねて下記のプログラムを記載致しましたが、
    メッセージ用JavaScliptが呼ばれずに、『localhostからEditac1d4daa.js(10バイト)を実行または保存しますか?』という
    メッセージと共に、『実行』、『保存』『キャンセル』ボタンが表示されます。


    ◎呼出元(コントローラー)
    //画面上に編集ボタンがあり、編集ボタンを押下した場合、
    //データの存在チェックを実施し、存在しなかった場合を想定しております。
     [HttpPost]
     public ActionResult Edit(string emanual, string cmd)
     {
         if (cmd == "編 集")
         {
       //該当データがない前提で、nullを格納する
             var ser = new JavaScriptSerializer();
             var code = String.Format("{0}({1})",
                                 "disp", ser.Serialize(null));

             // 生成した文字列をJavaScriptのコードとして返す
             return JavaScript(code);

         }

         return View();
     }


    ◎呼出先(共通ファイルである『_Layout.cshtml』)
     <!DOCTYPE html>
     <html>
     <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
         <meta charset="utf-8" />
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
         <title>@ViewBag.Title - マイ ASP.NET アプリケーション</title>
         @Styles.Render("~/Content/css")
         @Scripts.Render("~/bundles/modernizr")
         @Scripts.Render("~/bundles/jquery")


         //ここが呼出されてメッセージを表示する予定・・・・・
         <script type="text/javascript">
             // サーバから受信したJavaScriptコードによって
             // 呼び出されるコールバック関数
             function disp(result) {
               if (result == null) {
                 window.alert("該当するデータがありません。");
               }
             }
         </script>

     </head>
     <body>
         <div class="navbar navbar-inverse navbar-fixed-top">
             <div class="container">
                 <div class="navbar-header">
                     <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                         <span class="icon-bar"></span>
                         <span class="icon-bar"></span>
                         <span class="icon-bar"></span>
                     </button>
                     @Html.ActionLink("アプリケーション名", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
                 </div>
                 <div class="navbar-collapse collapse">
                     <ul class="nav navbar-nav">
                         <li>@Html.ActionLink("ホーム", "Index", "Home")</li>
                         <li>@Html.ActionLink("詳細", "About", "Home")</li>
                         <li>@Html.ActionLink("連絡先", "Contact", "Home")</li>
                     </ul>
                     @Html.Partial("_LoginPartial")
                 </div>
             </div>
         </div>
         <div class="container body-content">
             @RenderBody()
             <hr />
             <footer>
                 <p>&copy; @DateTime.Now.Year - マイ ASP.NET アプリケーション</p>
             </footer>
         </div>

         @Scripts.Render("~/bundles/bootstrap")
         @RenderSection("scripts", required: false)
     </body>
     </html>

    以上、何卒宜しくお願い申し上げます。

    2017年5月1日 1:58
  • 参考にされている記事の「JavaScriptのコードを出力する- JavaScriptResultオブジェクト -」のセクションに書いてあるように JSONP を利用したいということですか?

    であれば、「[2]クライアント・ページを作成する」のセクションで "ポイントとなるのは太字の部分だ" というところが質問者さんのコードにないように見えますが、そこはどうしているのですか?

    その前に、JSONP の基本的な知識を勉強する必要があるのではないかと思います。

    参考にされている記事には JSONP の仕組みを利用した方法が詳しく書いてあり、それを読むだけでも基本的な知識は得られるはずです。

    2017年5月1日 4:55
  • いつもお世話になっております。

    検索画面に下記が抜けておりましたので
    追記致しました。

    <head>
        <title>検索画面</title>
        <script type="text/javascript" src="~/Scripts/jquery-3.1.1.min.js"></script>

        <script type="text/javascript">
            function btn_click() {
                $("<script>")
                  .attr('type', 'text/javascript')
                  .attr('src', String.format(
                    "http://localhost:61755/EnglishFigureCompEidt/Edit?emanual={0}&cmd={1}",
                      $('#emanual').attr('value'),
                      $('#cmd').attr('value')))
                  .appendTo($("head"));
            }
        </script>
    </head>

    検索画面に追記後、改めて実行した際に、下記のスクリプトエラーメッセージが出力され、処理が中断されてしまいます。
    『0x800a01b6 - JavaScript 実行時エラー: オブジェクトは 'format' プロパティまたはメソッドをサポートしていません。』

    例ではスクリプトをインポートする際に下記を使用していますが、
    『<script src="jquery.js" type="text/javascript"></script>』

    私の下記のファイルではサポートしていない為、同じファイルを取得してこないといけないという理解で宜しいでしょうか?
    <script type="text/javascript" src="~/Scripts/jquery-3.1.1.min.js"></script>

    また、検索画面のスクリプトとエラーメッセージは同じcshtmlファイルにないとダメですか?


    以上、何卒宜しくお願い申し上げます。


    • 編集済み kong0214 2017年5月1日 8:20 パラメータの変更
    2017年5月1日 6:58
  • > 検索画面に下記が抜けておりましたので
    > 追記致しました。

    jQuery の外部スクリプトファイルの参照は不要なはずです。

    質問者さんの以前のスレッド(URL 下記)で自動生成された _Layout.cshtml を使うと外部スクリプトファイルの参照はどうなるかを書きましたが覚えてますか?

    Jqueryプラグインを使用する方法について
    https://social.msdn.microsoft.com/Forums/ja-JP/2796fcb2-fdd6-4085-81f1-6bd72515b197/jquery?forum=aspnetja

    質問者さんの場合もそのようになっていると思いますが、そうであれば、jQuery の外部スクリプトファイルの参照は定義済みです。2 重になってしまうので質問者さんが追加した方は削除してください。

    また、インラインのスクリプトはどこに書くかも示しましたが覚えてますか? その通りにやりましょう。

    > オブジェクトは 'format' プロパティまたはメソッドをサポートしていません

    JavaScript には .NET のような String.Format メソッドはないはずです。参考にされている記事の作者が自作しているのではないでしょうか?

    String.format("http://...",  $('#emanual').attr('value'))) の部分は普通に文字列連結でやってみてください。

    2017年5月1日 8:31
  • 一つ書き忘れていました。先の質問者さんのレスのコードで、アクションメソッドに [HttpPost] が付与されてますが、要求は GET で出るのでそれは削除してください。

    あともう一つ。どのみち jQuery を使うのであれば、jQuery.ajax を使う方がよさそうです。

    script タグの生成は jQuery が自動的にやってくれます。dataType: 'jsonp' の設定があれば jQuery が自動的に URL にクエリ文字列 &callback=jQuery... を追加してくれます。success: function (data) の data にはパース済みの JavaScript オブジェクトが渡されます。なので cshtml に書くコードは以下だけで済みます(あくまで例です)。

    function btn_click() {
        var address = '/EnglishFigureCompEidt/Edit?emanual=' + $('#emanual').val();
        $.ajax({
            type: 'GET',
            url: address,
            dataType: 'jsonp',
            success: function (data) {
                // data の処置(省略)
            }
        });
    }
    なお、その場合はアクションメソッドの第 2 引数の cmd は callback に変更する必要がありますので注意してください。

    2017年5月1日 9:01
  • いつもお世話になっております。

    ご教示頂きました例を基に、下記の通りに記載致しました。
    第二引数はcallback用にせず、どのボタンが押下されたかを渡したいのでボタン名を記載致しました。

    検索画面ビュー
     <html>
     <head>
         <title>英文図番構成編集</title>
         <script type="text/javascript">
             function btn_click() {
                 var address = 'http://localhost:61755//EnglishFigureCompEidt/Edit?emanual=' + $('#emanual').val() + '&cmd=' + $('#cmd').val();
                 $.ajax({
                     type: 'GET',
                     url: address,
                     dataType: 'jsonp',
                     success: function (data) {
                         alert('success!!');
                     }
                 });
             }
         </script>
     </head>
     <body>
         <br />
         @using (Html.BeginForm("Edit", "EnglishFigureCompEidt", null, FormMethod.Post))
         {
             <div style="color:Red">@Html.Encode(ViewData["errorMsg"])</div>
             <table class="form-group">
                 <tr>
                     <td>
                         <table>
                             <tr>
                                 <th>英文図番</th>
                                 <td>&nbsp;&nbsp;@Html.TextBox("emanual", "", new { maxlength = 20 })</td>
                             </tr>
                         </table>
                         <br />

                             <input type="submit" name="cmd" value="編 集"    class="btn btn-default" onclick="btn_click()"/>
                             &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                             &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                             <input type="submit" name="cmd" value="図番削除" class="btn btn-default"/>
                     </td>
                 </tr>
             </table>
         }
     </body>
     </html>


    ◎コントローラー(HttpGetは削除しました)
     public ActionResult Edit(string emanual, string cmd)
     {
         if (cmd == "編 集")
         {

             // 取得したBookオブジェクトをシリアライズし、
             // JavaScriptのコードを生成
             var ser = new JavaScriptSerializer();
             var code = String.Format("{0}({1})",
                                 "disp", ser.Serialize(null));

             // 生成した文字列をJavaScriptのコードとして返す
             return JavaScript(code);

         }
         else
         {
             //図番削除ボタンが押下された場合
             //何も記載しないとエラーになるのでとりあえず、returnを記載
             return View();
         }
     }


    改めていくつかご教示頂けないでしょうか?

     1.デバッグしていると、コントローラーメソッドが2回呼ばれます。
      1回目はcmdパラメータに何も入っておらず、2回目に値が入ってきますが、何故2回呼ばれ
      しかも1回目にはcmdパラメータに値が入っていないのでしょうか?
      ネットで検索しても2重サブミット等の事象に当てはまりません・・・


     2.下記はPostのままで良いですか?
     @using (Html.BeginForm("Edit", "EnglishFigureCompEidt", null, FormMethod.Post))


    以上、何卒宜しくお願い申し上げます。

    2017年5月1日 11:27
  • 先のレスで、

    > また、インラインのスクリプトはどこに書くかも示しましたが覚えてますか? その通りにやりましょう。

    と書きましたがそれはどうなっているのでしょう?

    > 第二引数はcallback用にせず、どのボタンが押下されたかを渡したいのでボタン名を記載致しました。

    そういうのは基本的ことができてから後でやるようにして、まずは基本的なことだけやって動作を確認してください。あれこれ違うことをされては面倒見切れません。



    2017年5月1日 11:45
  • いつもお世話になっております。

    参考サイトの通りになるように修正致しました。
    また、スクリプトの記載場所も修正済みです。

    ビューの編集ボタンを押下するとコントローラ経由で共通レイアウトのdsip関数を呼出して
    メッセージを表示できるようにはなりました。

    しかし、表示されたメッセージボックスのOKボタン押下後に、
    『localhostからEdit0f59daec.js(6バイト)を実行または保存しますか?』と更にメッセージが上がってきます。

    また、コントローラのパラメータにおいて、受けてであるcallbackには'disp'(文字列固定)を渡しているのに
    デバッグでのステップ実行をすると「null」になったり「disp」になったりと値が可変します。
    ちなみに、もうひとつのパラメータである「emanual」は一切可変致しませんが、何故でしょうか?

    もし、修正点や確認点があればご教示頂きたく、
    何卒宜しくお願い申し上げます。

    ◎共通レイアウト
     <!DOCTYPE html>
     <html>
     <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
         <meta charset="utf-8" />
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
         <title>@ViewBag.Title - マイ ASP.NET アプリケーション</title>
         @Styles.Render("~/Content/css")
         @Scripts.Render("~/bundles/modernizr")
        
         <script type="text/javascript">
             // サーバから受信したJavaScriptコードによって
             // 呼び出されるコールバック関数
             function disp(result) {
               if (result == null) {
                 window.alert("該当するデータがありません。本当にきてる?");
               } else {
                 var builder = new Sys.StringBuilder();
                 builder.append("タイトル:" + result.title);
                 builder.append("価格:" + result.price + "円");
                 builder.append("出版社:" + result.publish);
                 window.alert(builder.toString("\r"));
               }
             }
         </script>
     </head>
     <body>
         <div class="navbar navbar-inverse navbar-fixed-top">
             <div class="container">
                 <div class="navbar-header">
                     <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                         <span class="icon-bar"></span>
                         <span class="icon-bar"></span>
                         <span class="icon-bar"></span>
                     </button>
                     @Html.ActionLink("アプリケーション名", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
                 </div>
                 <div class="navbar-collapse collapse">
                     <ul class="nav navbar-nav">
                         <li>@Html.ActionLink("ホーム", "Index", "Home")</li>
                         <li>@Html.ActionLink("詳細", "About", "Home")</li>
                         <li>@Html.ActionLink("連絡先", "Contact", "Home")</li>
                     </ul>
                     @Html.Partial("_LoginPartial")
                 </div>
             </div>
         </div>
         <div class="container body-content">
             @RenderBody()
             <hr />
             <footer>
                 <p>&copy; @DateTime.Now.Year - マイ ASP.NET アプリケーション</p>
             </footer>
         </div>

         @Scripts.Render("~/bundles/jquery")
         @Scripts.Render("~/bundles/bootstrap")
         @RenderSection("scripts", required: false)
     </body>
     </html>


    ◎ビュー
     <html>
     <head>
         <title>英文図番構成編集</title>
         <script type="text/javascript">
             function btn_click() {
                 var address = '/EnglishFigureCompEidt/Edit?emanual=' + $('#emanual').val() + '&callback=disp';
                 $.ajax({
                     type: 'GET',
                     url: address,
                     dataType: 'jsonp',
                     success: function (data) {
                         alert('success!!');
                     }
                 });
             }
         </script>
     </head>
     <body>
         <br />
         @using (Html.BeginForm("Edit", "EnglishFigureCompEidt", null, FormMethod.Post))
         {
             <div style="color:Red">@Html.Encode(ViewData["errorMsg"])</div>
             <table class="form-group">
                 <tr>
                     <td>
                         <table>
                             <tr>
                                 <th>英文図番</th>
                                 <td>&nbsp;&nbsp;@Html.TextBox("emanual", "", new { maxlength = 20 })</td>
                             </tr>
                         </table>
                         <br />
                             <input type="submit" name="cmd1" value="編 集"    class="btn btn-default" onclick="btn_click()"/>
                             &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                             &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                             <input type="submit" name="cmd2" value="図番削除" class="btn btn-default"/>
                     </td>
                 </tr>
             </table>
         }

     </body>
     </html>


    ◎ビューから呼ばれるコントローラー
        public ActionResult Edit(string emanual, string callback)
        {

            if (emanual == "")
            {
                //図番未入力
                ViewData["errorMsg"] = Utility.GetMessage("E026");
                return View("EnglishFigureCompEdit");
            }

            // 取得したBookオブジェクトをシリアライズし、
            // JavaScriptのコードを生成
            var ser = new JavaScriptSerializer();
            var code = String.Format("{0}({1})",
                                callback, ser.Serialize(null));

            // 生成した文字列をJavaScriptのコードとして返す
            return JavaScript(code);

        }

    2017年5月2日 2:06
  • こちらのアドバイス通りにやってないし、やってることがメチャクチャに見えますが、それはちょっと置いておいて、確認させてください。

    もしかして、以下のようなストーリーが背景にあって、このスレッドで質問しているのは (4), (5) のやり方ではないかと想像しているのですが、いかがですか?

    (1) 「英文図番構成編集」というタイトルの画面に[英文図番]というテキストボックスと[編集]&[図番削除]という 2 つのボタンがある。

    (2) ユーザーが[英文図番]テキストボックスに入力し[編集]ボタンをクリック。

    (3) ユーザー入力がサーバーに POST される。

    (4) サーバーで、ユーザーが入力したデータが DB にあるか否かをチェックする。

    (5) データが DB にない場合は同じ画面にエラーメッセージを表示しユーザーに再入力を促す。

    (6) データが DB に存在すれば編集用の別画面に遷移する。

    そうだとすると、質問者さんが参考にしている記事の JSONP を使って何とかするという方法は見当違いで、やり方を見直す(例えば、データアノテーション検証で行う)べきだと思います。

    上記の想像がハズレの場合が、質問の背景&全体のストーリーをきちんと書いていただけませんか?

    前のスレッド「プロジェクトの初期起動について」の話を思い出してください。そもそものやりたいことやストーリーのごく一部を切り出して質問すると、もしその質問が見当違いだった場合は、なかなか解決にたどり着けません。時間の無駄でもありますし。

    プロジェクトの初期起動について
    https://social.msdn.microsoft.com/Forums/ja-JP/72bf36b9-22ca-4cc1-9389-252c5fd32e58?forum=aspnetja

    また前のスレッドのように時間の無駄にならないようにお願いします。

    2017年5月2日 2:49
  • いつもお世話になっております。

    示して頂いたストーリーそのままが、自分がやりたいことです。

    ちなみに、今後検索画面を作成する予定で、
    検索条件に該当しない場合でも、同様にエラーメッセージを表示したいのです。

    • 編集済み kong0214 2017年5月2日 4:09
    2017年5月2日 4:03
  • > 示して頂いたストーリーそのままが、自分がやりたいことです。

    それを、質問者さん自身が、一番最初の質問の、一番最初に書きましょうよ。次回は必ずお願いします。

    上のレスに書きましたが、データアノテーション検証を使うことを検討してください。

    2017年5月2日 4:40
  • いつもお世話になっております。

    やりたい事が伝わらず、申し訳ございません。
    ポップアップに拘る場合は、今までのJSONPで出来ると考えて良いですか?

    検索画面で検索結果が0件の場合であったり、
    登録完了後に完了メッセージを表示したりと、各コントロールに依存するメッセージでないケースがあり、
    統一したいと考えております。


    以上です。

    2017年5月2日 5:24
  • > ポップアップに拘る場合は、今までのJSONPで出来ると考えて良いですか?

    一行でそんなことを言われても何がしたいのか分からないので分かりません。やりたいことのシナリオ・ストーリーを詳細に書いてください。


    > 検索画面で検索結果が0件の場合であったり、
    > 登録完了後に完了メッセージを表示したりと、各コントロールに依存するメッセージでないケースがあり、
    > 統一したいと考えております。

    これも意味が分かりません。

    2017年5月2日 5:35
  • いつもお世話になっております。

    示して頂いたストーリーの通りです。
    (5)のメッセージをポップアップで出したいと考えております。

    (1) 「英文図番構成編集」というタイトルの画面に[英文図番]というテキストボックスと[編集]&[図番削除]という 2 つのボタンがある。

    (2) ユーザーが[英文図番]テキストボックスに入力し[編集]ボタンをクリック。

    (3) ユーザー入力がサーバーに POST される。

    (4) サーバーで、ユーザーが入力したデータが DB にあるか否かをチェックする。

    (5) データが DB にない場合は同じ画面にエラーメッセージを表示しユーザーに再入力を促す。

    (6) データが DB に存在すれば編集用の別画面に遷移する。


    理由は他の画面でも同様にポップアップで出したい画面があるからです。・・・ではダメでしょうか?
    ポップアップで出せるならJSONPにこだわりませんが、
    他に参考になるサイトが自分では見つける事が出来ませんでした。


    以上です。

    2017年5月2日 6:09
  • > 示して頂いたストーリーの通りです。

    シナリオ・ストーリーを変えないと、参考にしている記事のやり方では無理ですね。

    例えば、[確認]ボタンで DB の有無を確認、確認後[編集]ボタンで編集画面に遷移というように 2 段階に変更すれば何とかなりそうですが・・・

    自分でもよく考えて、どういう動きになるのか理解してください。今はやってることがめちゃくちゃです。きちんと考えてもらって理解してもらえないことには話が通じないです。

    2017年5月2日 7:01
  • いつもお世話になっております。
    DB確認を伴った場合、画面遷移するか、ポップアップメッセージ表示後、元の画面に留まるかの処理が
    JSONPを参考にした場合、無理だという事でしょうか?

    下記のケースでは画面遷移は伴いませんが、それだったら可能でしょうか?
    SurferOnWwwさんの場合、ユーザーに該当データがない事を知らせる際に
    どのような手法をとられるのでしょうか?


    (1)テキストボックスが二個、検索ボタンが一つ、検索結果を表示するグリッドがあるとします。

    (2)テキストボックスにそれぞれ検索したい項目を入力後、検索ボタン押下。

    (3)サーバーでユーザーが入力した検索条件に該当するデータが存在するかチェックする。

    (4)該当データが存在しなかった場合、ポップアップメッセージを表示する

    (5)該当データ存在した場合、グリッドにデータを表示する

    以上、何卒宜しくお願い申し上げます。


    • 編集済み kong0214 2017年5月2日 8:36
    2017年5月2日 8:34
  • 説明しても理解してもらえない気がしますが、一応説明します。これ以上は、参考にされている記事の通り実装して、参考にされている記事の通り動くようになって、その仕組みが十二分に理解できてからにしてください。

    > DB確認を伴った場合、画面遷移するか、ポップアップメッセージ表示後、元の画面に留まるかの処理が
    > JSONPを参考にした場合、無理だという事でしょうか?

    まずポップアップ云々はまったく何の関係もないです。そこにこだわらないで、ひとまずポップアップ云々は忘れてください。

    基本的にはユーザーが正しい情報を入力することを期待しているはずです。なので、[編集]ボタンクリックで編集画面に遷移するというのが普通のシナリオになるはずです。

    しかしながら、[編集]ボタンクリックで、参考にされている記事のように JSONP を利用して検証結果を返すような操作を行った場合、検証 OK の場合に編集画面に遷移するのはどうするのですか?

    何か特別なことをすれば分かりませんが、普通ではできませんよね? それは、JSONP を使う方法でなくても、例えば ajax でアクションメソッドに問い合わせる方法を取っても同じです。

    だから、先のレスで、データアノテーション検証を使うことを検討してくださいと書いたのです。

    または、シナリオを変えて、[確認]ボタンで DB の有無を確認、確認後[編集]ボタンで編集画面に遷移というように 2 段階にするかですね。

    > 下記のケースでは画面遷移は伴いませんが、それだったら可能でしょうか?

    今は考える気がしません。まずは質問者さんが上に書いたことをよく考えて十二分に理解して、その上でどうしても他のシナリオを考えざるを得ないということが説明できてからの話です。

    • 回答としてマーク kong0214 2017年9月15日 7:08
    2017年5月2日 11:11
  • いつもお世話になっております。

    出来てもおりませんが、ユーザーに出来ない理由も正しく説明できないので、

    検討結果を改めてご報告させて頂きます。

    今までお付き合いいただきましてSurferOnWwwさんには感謝しております。

    また、自分の中では方法も結論も出ていないので、このスレッドはクローズも致しません。

    以上です。


    • 編集済み kong0214 2017年5月2日 16:16 誤記訂正
    2017年5月2日 16:14
  • いつもお世話になっております。

    ご報告が遅くなりまして申し訳御座いません。

    入力チェックを伴う画面遷移の検討結果は下記の通りに致しました。
    例として、基本情報画面 ⇒ 詳細情報画面へ遷移する場合、

     ①基本情報画面の詳細ボタン押下
     
     ②基本情報画面に記載しているスクリプトにて、入力チェックを実施
     
     ③入力チェックがNGの場合、alertにてメッセージを表示し、return falseにて処理を抜ける
     
     ④入力チェックがOKの場合、基本情報画面のコントローラにて、DB存在チェックを実施
     
     ⑤DB存在チェックがNGの場合、基本情報画面のコントローラから、cshtmlファイルを呼出し、
      alertにてメッセージを表示後、呼出元の画面を再描画する。

     ⑥DB存在チェックがOKの場合、cshtml※ファイルを呼出し詳細情報画面へ遷移する。
     
      ※画面遷移をする際の、中間ファイル

    上記でやりきりましたが、画面制御が面倒だったので、DBチェックを伴う画面遷移を
    次回やる際は、下記で検討しようと思いました。
     ・画面遷移前に、ご教示頂きました確認ボタンでDBチェックを事前チェックし、
      OKの場合のみ、次画面遷移ボタンが押下できる
     ・遷移後の画面を子画面として別ブラウザで呼出し、遷移後の子画面にてDBチェックを実施し、
      NGの場合、閉じる


    以上です。

    2017年9月15日 7:07