none
検証コントロール + マスターページ in WebサイトのWebアプリケーション RRS feed

  • 質問

  • 下の組み合わせでは、検証コントロールは働かないのでしょうか?

    未だノービスで、よく分かっていませんが、マスターページを使っているWebアプリケーションで、EDMを使ってSQL Server上のデータをGridViewに表示させようとしています。

    また、表示するデータは、TextBoxを使って期間(from - to)を入力し、その期間のデータにしぼろうとしています。そして、そのTextBoxの入力チェックに検証コントロールを使おうとしているのですが、検証コントロールが働かず、IQueryableでエラーになってしまいます。

    しかし、マスターページを使用しないと、検証コントロールは働き、GridViewにデータが表示されます。
    なお、上記のマスターページを使用しているWebアプリケーションと使用していないWebアプリケーションは同一Webサイトに作成しました。また、マスターページ使用のWebアプリケーションについては、各ツールを同一Panel上に配置したものと、同一UpdatePanelに配置したものと2パターンを試しました。

    C#
    Webサイト
    Webアプリケーション
    マスターページ
    検証コントロール
    GridView
    Entity Framework (EDM)

    下はマスターページを使用しているaspxとaspx.cs、そして、使用していないaspxとaspx.csです。

    なお、動作確認段階のプログラムであるため、期間指定のためのTextBoxの内、最初の方のみに検証コントロールを仕掛けています。

    なお、その他、必要な情報がありましたら、お教えいただければ助かります。

    マスターページ使用で、検証コントロールが働かない、Webアプリケーションのaspx

    <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPageShokengyomu.master" AutoEventWireup="true" CodeFile="Test01.aspx.cs" Inherits="Test01" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server">
        <asp:Panel ID="Panel1" runat="server">
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" Display="None" ErrorMessage="date required" SetFocusOnError="True" ValidationGroup="1"></asp:RequiredFieldValidator>
            <asp:RangeValidator ID="RangeValidator1" runat="server" ControlToValidate="TextBox1" CultureInvariantValues="True" Display="None" ErrorMessage="invalid date" MaximumValue="2999/12/31" MinimumValue="1999/01/01" SetFocusOnError="True" Type="Date" ValidationGroup="1"></asp:RangeValidator>
            <asp:ValidationSummary ID="ValidationSummary1" runat="server" ValidationGroup="1" />
        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" ValidationGroup="1" />
        <br />
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="t_nyukin_denpyo_id" SelectMethod="GridView1_GetData">
            <Columns>
                <asp:BoundField DataField="t_nyukin_denpyo_id" HeaderText="t_nyukin_denpyo_id" InsertVisible="False" ReadOnly="True" SortExpression="t_nyukin_denpyo_id" />
                <asp:BoundField DataField="t_nyukin_denpyo_shori_ymd" HeaderText="t_nyukin_denpyo_shori_ymd" SortExpression="t_nyukin_denpyo_shori_ymd" />
                <asp:BoundField DataField="t_nyukin_denpyo_buten_code" HeaderText="t_nyukin_denpyo_buten_code" SortExpression="t_nyukin_denpyo_buten_code" />
                <asp:BoundField DataField="t_nyukin_denpyo_atsukai_sha_code" HeaderText="t_nyukin_denpyo_atsukai_sha_code" SortExpression="t_nyukin_denpyo_atsukai_sha_code" />
                <asp:BoundField DataField="t_nyukin_denpyo_atsukai_sha_mei" HeaderText="t_nyukin_denpyo_atsukai_sha_mei" SortExpression="t_nyukin_denpyo_atsukai_sha_mei" />
                <asp:BoundField DataField="t_nyukin_denpyo_kokyaku_code" HeaderText="t_nyukin_denpyo_kokyaku_code" SortExpression="t_nyukin_denpyo_kokyaku_code" />
                <asp:BoundField DataField="t_nyukin_denpyo_kokyaku_mei_kanji" HeaderText="t_nyukin_denpyo_kokyaku_mei_kanji" SortExpression="t_nyukin_denpyo_kokyaku_mei_kanji" />
                <asp:BoundField DataField="t_nyukin_denpyo_kokyaku_mei_kana" HeaderText="t_nyukin_denpyo_kokyaku_mei_kana" SortExpression="t_nyukin_denpyo_kokyaku_mei_kana" />
                <asp:BoundField DataField="t_nyukin_denpyo_PWM_furikomisaki_shiten_code" HeaderText="t_nyukin_denpyo_PWM_furikomisaki_shiten_code" SortExpression="t_nyukin_denpyo_PWM_furikomisaki_shiten_code" />
                <asp:BoundField DataField="t_nyukin_denpyo_virtual_koza_no" HeaderText="t_nyukin_denpyo_virtual_koza_no" SortExpression="t_nyukin_denpyo_virtual_koza_no" />
                <asp:BoundField DataField="t_nyukin_denpyo_kingaku" HeaderText="t_nyukin_denpyo_kingaku" SortExpression="t_nyukin_denpyo_kingaku" />
                <asp:BoundField DataField="t_nyukin_denpyo_himoduke" HeaderText="t_nyukin_denpyo_himoduke" SortExpression="t_nyukin_denpyo_himoduke" />
                <asp:BoundField DataField="t_nyukin_denpyo_furikomi_nyukin_tsuchi_file_mei" HeaderText="t_nyukin_denpyo_furikomi_nyukin_tsuchi_file_mei" SortExpression="t_nyukin_denpyo_furikomi_nyukin_tsuchi_file_mei" />
                <asp:BoundField DataField="t_nyukin_denpyo_shori_ymd_time" HeaderText="t_nyukin_denpyo_shori_ymd_time" SortExpression="t_nyukin_denpyo_shori_ymd_time" />
                <asp:BoundField DataField="t_nyukin_denpyo_nyukin_kanjo_ymd" HeaderText="t_nyukin_denpyo_nyukin_kanjo_ymd" SortExpression="t_nyukin_denpyo_nyukin_kanjo_ymd" />
                <asp:BoundField DataField="t_nyukin_denpyo_nyukin_kisan_ymd" HeaderText="t_nyukin_denpyo_nyukin_kisan_ymd" SortExpression="t_nyukin_denpyo_nyukin_kisan_ymd" />
                <asp:BoundField DataField="t_nyukin_denpyo_shimuke_ginko_mei" HeaderText="t_nyukin_denpyo_shimuke_ginko_mei" SortExpression="t_nyukin_denpyo_shimuke_ginko_mei" />
                <asp:BoundField DataField="t_nyukin_denpyo_shimuke_shiten_mei" HeaderText="t_nyukin_denpyo_shimuke_shiten_mei" SortExpression="t_nyukin_denpyo_shimuke_shiten_mei" />
                <asp:BoundField DataField="t_nyukin_denpyo_torikeshi_kubun" HeaderText="t_nyukin_denpyo_torikeshi_kubun" SortExpression="t_nyukin_denpyo_torikeshi_kubun" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:honbanConnectionString6 %>" SelectCommand="SELECT * FROM [t_nyukin_denpyo]"></asp:SqlDataSource>
        <br />
        <br />
    </asp:Panel>
    </asp:Content>
    

    マスターページ使用で、検証コントロールが働かない、Webアプリケーションのaspx.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.ModelBinding;
    
    public partial class Test01 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack == false) //期間指定の初期値設定(最初に画面が呼ばれた場合)
            {
                // "From" に7日前、"To" に本日をセット
    
                DateTime OneWeekBefore = DateTime.Today.AddDays(-7);
                TextBox1.Text = OneWeekBefore.ToString("yyyy/MM/dd");
    
                TextBox2.Text = DateTime.Today.ToString("yyyy/MM/dd");
            }
        }
    
        public IQueryable<t_nyukin_denpyo> GridView1_GetData(
        [Control("TextBox1")] DateTime from_date,
        [Control("TextBox2")] DateTime to_date
        )
        {
            var _table1 = new honbanEntities();
            return _table1.t_nyukin_denpyo.Where(x =>
            (x.t_nyukin_denpyo_shori_ymd >= from_date)
            &&
            (x.t_nyukin_denpyo_shori_ymd <= to_date)
            );
        }
    
        protected void Button1_Click(object sender, EventArgs e)
        {
    
        }
    }

    マスターページ不使用で、検証コントロールが働く、Webアプリケーションのaspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test03.aspx.cs" Inherits="Test03" %>
    
    <!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>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:Panel ID="Panel1" runat="server">
                    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
                    <br />
                    <asp:Button ID="Button1" runat="server" Text="Button" />
                    <br />
                    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="t_nyukin_denpyo_id" SelectMethod="GridView1_GetData" PageSize="5">
                        <Columns>
                            <asp:BoundField DataField="t_nyukin_denpyo_id" HeaderText="t_nyukin_denpyo_id" InsertVisible="False" ReadOnly="True" SortExpression="t_nyukin_denpyo_id" />
                            <asp:BoundField DataField="t_nyukin_denpyo_shori_ymd" HeaderText="t_nyukin_denpyo_shori_ymd" SortExpression="t_nyukin_denpyo_shori_ymd" />
                            <asp:BoundField DataField="t_nyukin_denpyo_buten_code" HeaderText="t_nyukin_denpyo_buten_code" SortExpression="t_nyukin_denpyo_buten_code" />
                            <asp:BoundField DataField="t_nyukin_denpyo_atsukai_sha_code" HeaderText="t_nyukin_denpyo_atsukai_sha_code" SortExpression="t_nyukin_denpyo_atsukai_sha_code" />
                            <asp:BoundField DataField="t_nyukin_denpyo_atsukai_sha_mei" HeaderText="t_nyukin_denpyo_atsukai_sha_mei" SortExpression="t_nyukin_denpyo_atsukai_sha_mei" />
                            <asp:BoundField DataField="t_nyukin_denpyo_kokyaku_code" HeaderText="t_nyukin_denpyo_kokyaku_code" SortExpression="t_nyukin_denpyo_kokyaku_code" />
                            <asp:BoundField DataField="t_nyukin_denpyo_kokyaku_mei_kanji" HeaderText="t_nyukin_denpyo_kokyaku_mei_kanji" SortExpression="t_nyukin_denpyo_kokyaku_mei_kanji" />
                            <asp:BoundField DataField="t_nyukin_denpyo_kokyaku_mei_kana" HeaderText="t_nyukin_denpyo_kokyaku_mei_kana" SortExpression="t_nyukin_denpyo_kokyaku_mei_kana" />
                            <asp:BoundField DataField="t_nyukin_denpyo_PWM_furikomisaki_shiten_code" HeaderText="t_nyukin_denpyo_PWM_furikomisaki_shiten_code" SortExpression="t_nyukin_denpyo_PWM_furikomisaki_shiten_code" />
                            <asp:BoundField DataField="t_nyukin_denpyo_virtual_koza_no" HeaderText="t_nyukin_denpyo_virtual_koza_no" SortExpression="t_nyukin_denpyo_virtual_koza_no" />
                            <asp:BoundField DataField="t_nyukin_denpyo_kingaku" HeaderText="t_nyukin_denpyo_kingaku" SortExpression="t_nyukin_denpyo_kingaku" />
                            <asp:BoundField DataField="t_nyukin_denpyo_himoduke" HeaderText="t_nyukin_denpyo_himoduke" SortExpression="t_nyukin_denpyo_himoduke" />
                            <asp:BoundField DataField="t_nyukin_denpyo_furikomi_nyukin_tsuchi_file_mei" HeaderText="t_nyukin_denpyo_furikomi_nyukin_tsuchi_file_mei" SortExpression="t_nyukin_denpyo_furikomi_nyukin_tsuchi_file_mei" />
                            <asp:BoundField DataField="t_nyukin_denpyo_shori_ymd_time" HeaderText="t_nyukin_denpyo_shori_ymd_time" SortExpression="t_nyukin_denpyo_shori_ymd_time" />
                            <asp:BoundField DataField="t_nyukin_denpyo_nyukin_kanjo_ymd" HeaderText="t_nyukin_denpyo_nyukin_kanjo_ymd" SortExpression="t_nyukin_denpyo_nyukin_kanjo_ymd" />
                            <asp:BoundField DataField="t_nyukin_denpyo_nyukin_kisan_ymd" HeaderText="t_nyukin_denpyo_nyukin_kisan_ymd" SortExpression="t_nyukin_denpyo_nyukin_kisan_ymd" />
                            <asp:BoundField DataField="t_nyukin_denpyo_shimuke_ginko_mei" HeaderText="t_nyukin_denpyo_shimuke_ginko_mei" SortExpression="t_nyukin_denpyo_shimuke_ginko_mei" />
                            <asp:BoundField DataField="t_nyukin_denpyo_shimuke_shiten_mei" HeaderText="t_nyukin_denpyo_shimuke_shiten_mei" SortExpression="t_nyukin_denpyo_shimuke_shiten_mei" />
                            <asp:BoundField DataField="t_nyukin_denpyo_torikeshi_kubun" HeaderText="t_nyukin_denpyo_torikeshi_kubun" SortExpression="t_nyukin_denpyo_torikeshi_kubun" />
                        </Columns>
                    </asp:GridView>
                    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:honbanConnectionString8 %>" SelectCommand="SELECT * FROM [t_nyukin_denpyo]"></asp:SqlDataSource>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" Display="None" ErrorMessage="RequiredFieldValidator" SetFocusOnError="True"></asp:RequiredFieldValidator>
                    <asp:RangeValidator ID="RangeValidator1" runat="server" ControlToValidate="TextBox1" Display="None" ErrorMessage="RangeValidator" MaximumValue="3000/12/31" MinimumValue="1000/01/01" Type="Date"></asp:RangeValidator>
                    <asp:ValidationSummary ID="ValidationSummary1" runat="server" />
                    <br />
                    <br />
                </asp:Panel>
            </div>
        </form>
    </body>
    </html>

    マスターページ不使用で、検証コントロールが働く、Webアプリケーションのaspx.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.ModelBinding;
    
    public partial class Test03 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack == false) //期間指定の初期値設定(最初に画面が呼ばれた場合)
            {
                // "From" に7日前、"To" に本日をセット
    
                DateTime OneWeekBefore = DateTime.Today.AddDays(-7);
                TextBox1.Text = OneWeekBefore.ToString("yyyy/MM/dd");
    
                TextBox2.Text = DateTime.Today.ToString("yyyy/MM/dd");
            }
        }
    
        // 戻り値の型は IEnumerable に変更できますが、// のページングと
        //並べ替えをサポートするには、次のパラメーターを追加する必要があります:
        //     int maximumRows
        //     int startRowIndex
        //     out int totalRowCount
        //     string sortByExpression
        public IQueryable<t_nyukin_denpyo> GridView1_GetData(
            [Control("TextBox1")] DateTime from_date,
            [Control("TextBox2")] DateTime to_date
            )
        {
            var _table1 = new honbanEntities();
            return _table1.t_nyukin_denpyo.Where(x =>
            (x.t_nyukin_denpyo_shori_ymd >= from_date)
            &&
            (x.t_nyukin_denpyo_shori_ymd <= to_date)
            )
            .OrderBy(x => x.t_nyukin_denpyo_shori_ymd)
            .ThenBy(x => x.t_nyukin_denpyo_kokyaku_mei_kana);
        }
    }


    2018年4月11日 7:59

回答

  • もし「空」のテンプレートで作った ASP.NET Web Forms アプリをそのまま使いたいという場合は、

    (1) Visual Studio の NuGet パッケージの管理画面を開き、以下の NuGet パッケージをインストールし(もし Bootstrap 等も必要でしたらそれも)、

    ・AspNet.ScriptManager.jQuery
    ・Microsoft.AspNet.ScriptManager.MsAjax
    ・Microsoft.AspNet.ScriptManager.WebForms
    ・Microsoft.AspNet.Web.Optimization
    ・Microsoft.AspNet.Web.Optimization.WebForms

    (2) 「Web フォーム」のテンプレートで自動生成される App_Start フォルダの BundleConfig.cs のコードを参考にバンドル定義を作成し、

    (3) 上のバンドル定義を Global.asax の Application_Start メソッドで登録し、

    (4) 「Web フォーム」のテンプレートで自動生成されるマスターページのコードを参考に、ScriptManager にスクリプトを登録してください。

    詳しくは以下の記事を見てください。

    ASP.NET 4.5 スクリプト マッピング
    http://surferonwww.info/BlogEngine/post/2018/04/24/aspnet-45-script-resource-mapping.aspx

    • 回答としてマーク Herokey 2018年4月25日 8:46
    2018年4月25日 2:16

すべての返信

  • Herokey さん、こんにちは。フォーラム オペレーターの立花です。
    MSDN フォーラムへご投稿くださいましてありがとうございます。

    ご質問につい来ましては、下記フォーラムの方が情報が寄せられやすい
    と思いますので移動させていただきますね。

    .Net Framework > ASP.NET

    それでは皆様からのご返信をおまちください。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年4月11日 8:21
    モデレータ
  • 開発環境(OS. .NET, IIS, Visual Studio, SQL Server のバージョン・エディションなど)を書いてください。特に .NET のバージョンが重要。
    2018年4月11日 8:23
  • 失礼いたしました。開発環境です。このプログラムについては、まだ配置をしておらず、VSから起動しています。

    開発用PC:windows10  10.0.16299.309

    .NET Framework:VS上、4.7.02556、Web.config上、4.6.1

    IIS:10.0.16299.15

    Microsoft Visual Studio Professional 2017  (2) Version 15.5.7 (Community 2017をインストール→Professional 2017をお試しでインストール→ライセンス購入)

    SQL Server: Microsoft SQL Server Express (64-bit)  version 13.0.4206.0

    Visual C# 2017 

    投稿前に環境情報を記入したのですが、タイムアウトのためか、投稿ボタンを押したときに吹っ飛び、ブラウザーの戻るボタンから修復したのですが、確認漏らしてしまいました。

    書き込みありがとうございます。

    2018年4月11日 8:54
  • > そのTextBoxの入力チェックに検証コントロールを使おうとしているのですが、検証コントロールが働かず、

    質問者さんの使っている MasterPage がどういうものか分かりませんのでその影響がないとは言い切れませんが、普通に考えて MasterPage 内に配置すると検証機能が働かないということはないと思うのですが・・・

    念のため、以下の自分の環境で検証してみましたが、期待通り検証機能は動きます。

    Visual Studio Cummunity 2015
    .NET Framework 4.6.1
    Windows 10 64-bit
    ローカルの IIS 10

    MasterPage はテンプレートで自動生成されたもの。中身のコードは質問者さんのコードをそのまま以下のようにコピペ(GridView 等検証に不要な部分は除く)。

    <%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" 
        AutoEventWireup="true" CodeFile="0032-ValidatorInMasterPage.aspx.cs" 
        Inherits="_0032_ValidatorInMasterPage" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
        <asp:Panel ID="Panel1" runat="server">
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" 
                ControlToValidate="TextBox1" Display="None" 
                ErrorMessage="date required" SetFocusOnError="True" 
                ValidationGroup="1">
            </asp:RequiredFieldValidator>
            <asp:RangeValidator ID="RangeValidator1" runat="server" 
                ControlToValidate="TextBox1" CultureInvariantValues="True" 
                Display="None" ErrorMessage="invalid date" MaximumValue="2999/12/31" 
                MinimumValue="1999/01/01" SetFocusOnError="True" Type="Date" ValidationGroup="1">
            </asp:RangeValidator>
            <asp:ValidationSummary ID="ValidationSummary1" runat="server" ValidationGroup="1" />
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
            <br />
            <asp:Button ID="Button1" runat="server" Text="Button" 
                 ValidationGroup="1" OnClick="Button1_Click" />
        </asp:Panel>
    </asp:Content>

    RequiredFieldValidator による検証。ボタンクリックでクライアントスクリプトによる検証がかかる。ポストバックはキャンセルされる。

    RangeValidator による検証。ボタンクリックでクライアントスクリプトによる検証がかかる。ポストバックはキャンセルされる。

    TextBox に 2018/1/1 を入力。検証 OK でポストバックされ、Page.IsValid は true となる。

    ポストバックによる応答で再描画された結果。

    質問者さんの方でもっときちんと切り分けしていただけませんか。

    2018年4月11日 11:56
  • SurferOnWwwさん

    ご回答ありがとうございます。そして、切り分けしておらず、大変申し訳ございませんでした。また、ご説明も不足しておりました。


    というのは、質問の元となったプログラムは、ScriptManagerやScriptManagerProxyも使用しておりました。これは、Timerコントロールを利用して、期間指定でGridViewに表示させたものを、一定時間経過後に自動再表示させることを目的としています。
    そこで、今回、このTimerコントロールや、そのためのScriptManagerやcriptManagerProxyを使わないバージョンを作成したところ、検証コントロールは働きました。

    2018年4月13日 8:58
  • > 質問の元となったプログラムは、ScriptManagerやScriptManagerProxyも使用しておりました。

    そういうことは掲示板の向こう側にいて掲示板に書いてあること以外は知る由もない第三者に分かるはずはなくて、今回の質問はひどく情報不足だと認識していただき、今後質問する際は改善していただければと思います。

    上の回答を書いた時間と労力は全くの無駄だったようです。私が費やした時間と労力は置いといても、ここを見て考えてくれた閲覧者の方は何人かいたはずで、その方たちの時間と労力も無駄になったかもしれませんよ。

    • 回答としてマーク Herokey 2018年4月19日 7:05
    • 回答としてマークされていない Herokey 2018年4月20日 8:47
    • 回答としてマーク Herokey 2018年4月20日 8:57
    • 回答としてマークされていない Herokey 2018年4月20日 8:57
    2018年4月13日 9:49
  • SurferOnWwwさん

    貴重なお時間を無駄にさせてしまい、大変申し訳ありませんでした。以後、気を付けます。

    2018年4月18日 5:51
  • SurferOnWwwさん、別サイトでの同質問「ScriptManagerと検証コントロール」でもご対応ありがとうございました。

    お言葉に甘えて、続けさせていただきます。

    まず、今更ながらに、まとめますと、マスターページを使っていなくても、(すみません。これは要因ではありませんでした。)

    VisualStudio、ASP.NET空のWebサイト、Webフォーム、GridView、TextBoxにRequiredFieldValidator、GridViewにはADO.NET Entity Data Modelを使ってSQL Serverのデータを表示しようとしていますが、RequiredFieldValidatorが働かず、TextBoxへの入力がないまま、参照キー:「Null」でDBにアクセスしてしまい、サーバーエラーになります。
    そして、出力を確認すると、例外「'System.Web.HttpUnhandledException' (System.Web.dll の中)」がスローされていました。

    この結果から、マスターページを使っていなくても、「GridViewあり&ScriptManagerあり」の場合に、RequiredFieldValidatorが働かない、もしくは、検証コントロールが働く前にDBにアクセスしてしまっているように見えますが、どう対応したら良いのか分かりません。

    ちなみに、上記環境が、「GridViewなし&ScriptManagerあり」や「GridViewあり&ScriptManagerなし」であった場合は、RequiredFieldValidatorは働きました。

    --------------------------------------------------------------------------
    プログラム構成:
    VisualStudio
    ASP.NET空のWebサイト
    Webフォーム
    GridView(ADO.NET Entity Data Modelを使ってSQL Serverのデータを表示)
    TextBoxをRequiredFieldValidatorで検証
    --------------------------------------------------------------------------

    RequiredFieldValidatorが働いた時の、出力の最後の部分

    例外がスローされました 下記ソースコードの行 1639、列 4 で発生しました。http://ajax.microsoft.com/ajax/jQuery/jquery-1.10.2.js
    0x800a139e - JavaScript 実行時エラー: SyntaxError
    例外がスローされました 下記ソースコードの行 1656、列 4 で発生しました。http://ajax.microsoft.com/ajax/jQuery/jquery-1.10.2.js
    0x800a139e - JavaScript 実行時エラー: SyntaxError
    プログラム '[13480] iexplore.exe' はコード -1 (0xffffffff) で終了しました。
    プログラム '[23144] iisexpress.exe' はコード 0 (0x0) で終了しました。


    RequiredFieldValidatorが働かなかった時の、出力の最後の部分

    例外がスローされました 下記ソースコードの行 1639、列 4 で発生しました。http://ajax.microsoft.com/ajax/jQuery/jquery-1.10.2.js
    0x800a139e - JavaScript 実行時エラー: SyntaxError
    例外がスローされました 下記ソースコードの行 1656、列 4 で発生しました。http://ajax.microsoft.com/ajax/jQuery/jquery-1.10.2.js
    0x800a139e - JavaScript 実行時エラー: SyntaxError
    例外がスローされました: 'System.Web.HttpUnhandledException' (System.Web.dll の中)
    プログラム '[4460] iexplore.exe' はコード 0 (0x0) で終了しました。
    プログラム '[23144] iisexpress.exe' はコード 0 (0x0) で終了しました。

    プログラムのDB参照部分

        public IQueryable<t_nyukin_denpyo> GridView1_GetData(
            [Control("TextBox1")] DateTime from_date,
            [Control("TextBox2")] DateTime to_date
            )
        {
            var _table = new honbanEntities();
            return _table.t_nyukin_denpyo.Where(x =>
            (x.t_nyukin_denpyo_shori_ymd >= from_date)
            &&
            (x.t_nyukin_denpyo_shori_ymd <= to_date));
        }

    public partial class honbanEntities : DbContext
    {
        public honbanEntities()
            : base("name=honbanEntities")
        {
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
    
        public virtual DbSet<t_nyukin_denpyo> t_nyukin_denpyo { get; set; }
    }

    Validation_NoMaster01.aspx

    Enterprise Libraryをインストールし、Exception Handling Application Blockを使って、エラーを拾う?などをやってみようと思っていますが、未だ、できていません。

    2018年4月20日 7:43
  • > 続けさせていただきます。

    Q&A を続けるのであれば「回答としてマーク」は外しておいた方が良いです。回答済になっているスレッドは注目されなくなって回答を得にくくなりますので。

    Entity Framework のバージョンは何でしょう?

    あと、全体が分かる、かつ問題を再現できる必要最低限のコードをアップしてください。あくまで、問題を再現するのに不要なコードは一切削除して、必要最低限でお願いします。

    ところで、どうしても、Entity Framework + GridView.SelectMethod で Web フォームでモデルのバインディングを使わなければならない理由があるのでしょうか?

    最初の質問のコードには SqlDataSource がありましたが、それを使えば、Entity Framework + GridView.SelectMethod を使わずとも、以下のスレッドに私が書いたサンプルのようにすればやりたいことができそうな気がしますが。

    日付の範囲を指定してGridViewに表示させたいのですが・・・
    https://social.msdn.microsoft.com/Forums/ja-JP/c985bb81-13bf-4cfc-a758-5467fd686394/gridview?forum=aspnetja

    2018年4月20日 8:45
  • アドバイスありがとうございます。「回答としてマーク」を解除しました。

    Entity Framework のバージョンは、

    Web.config内:6.0.0.0(<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>)

    NuGet内:6.1.3

    と、なっています。

    どうしても、Entity Framework + GridView.SelectMethod で Web フォームでモデルのバインディングを使わなければならない理由はありません。私がEDMを使っている理由は、私の知識の範囲で、GridViewに、範囲指定でデータ参照した結果を表示させることができるのは、この方法のみであるためです。マイクロソフトの無料トレーニングと書籍「ASP.NET Webフォームアプリ開発」を参考にした方法です。ただ、個々のPCにプログラムを配置せずとも、サーバーにプログラムを配置すれば、どのPCからでも使えるようにしたいので、Webサイトを選びました。

    教えて頂いたスレッドを拝見します。ありがとうございます。

    また、コードは下記です。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.ModelBinding;
    
    public partial class Validation_NoMaster01 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack == false) //期間指定の初期値設定(最初に画面が呼ばれた場合)
            {
                // "From" に7日前、"To" に本日をセット
    
                DateTime OneWeekBefore = DateTime.Today.AddDays(-7);
                TextBox1.Text = OneWeekBefore.ToString("yyyy/MM/dd");
    
                TextBox2.Text = DateTime.Today.ToString("yyyy/MM/dd");
            }
        }
    
        // 戻り値の型は IEnumerable に変更できますが、// のページングと
        //並べ替えをサポートするには、次のパラメーターを追加する必要があります:
        //     int maximumRows
        //     int startRowIndex
        //     out int totalRowCount
        //     string sortByExpression
        public IQueryable<t_nyukin_denpyo> GridView1_GetData(
            [Control("TextBox1")] DateTime from_date,
            [Control("TextBox2")] DateTime to_date
            )
        {
            var _table = new honbanEntities();
            return _table.t_nyukin_denpyo.Where(x =>
            (x.t_nyukin_denpyo_shori_ymd >= from_date)
            &&
            (x.t_nyukin_denpyo_shori_ymd <= to_date));
        }
    
        protected void Button1_Click(object sender, EventArgs e)
        {
            //try
            //{ }
            //catch (HttpUnhandledException e)
            //{
            //    throw new System.Web.HttpUnhandledException("Web アプリケーション内で未処理例外が発生しました。", e);
            //}
        }
    }

    //------------------------------------------------------------------------------
    // <auto-generated>
    //     このコードはテンプレートから生成されました。
    //
    //     このファイルを手動で変更すると、アプリケーションで予期しない動作が発生する可能性があります。
    //     このファイルに対する手動の変更は、コードが再生成されると上書きされます。
    // </auto-generated>
    //------------------------------------------------------------------------------
    
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    
    public partial class honbanEntities : DbContext
    {
        public honbanEntities()
            : base("name=honbanEntities")
        {
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
    
        public virtual DbSet<t_nyukin_denpyo> t_nyukin_denpyo { get; set; }
    }
    

    この辺りのコードがあればよろしいでしょうか?まだまだ、よく分かっておらず・・・

    早速の返答をありがとうございます。


    2018年4月20日 9:20
  • .aspx のコードもお願いします。(.aspx のコードがないと問題の ScriptManager をどのように使っているかが分からない・・・ということぐらいは配慮いただければと思います)

    また、あくまで必要最低限でお願いします。(コメントアウトしたコードとかは読むのに邪魔です)

    2018年4月20日 9:56
  • 気づかず失礼しました。

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Validation_NoMaster01.aspx.cs" Inherits="Validation_NoMaster01" %>
    
    <!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>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:ScriptManager ID="ScriptManager1" runat="server" AllowCustomErrorsRedirect="true" AsyncPostBackErrorMessage="String">
                </asp:ScriptManager>
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
                <br />
                <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="RequiredFieldValidator" SetFocusOnError="True"></asp:RequiredFieldValidator>
                <br />
                <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
                <br />
                <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="t_nyukin_denpyo_id" SelectMethod="GridView1_GetData">
                    <Columns>
                        <asp:BoundField DataField="t_nyukin_denpyo_id" HeaderText="t_nyukin_denpyo_id" InsertVisible="False" ReadOnly="True" SortExpression="t_nyukin_denpyo_id" />
                        <asp:BoundField DataField="t_nyukin_denpyo_shori_ymd" HeaderText="t_nyukin_denpyo_shori_ymd" SortExpression="t_nyukin_denpyo_shori_ymd" />
                        <asp:BoundField DataField="t_nyukin_denpyo_buten_code" HeaderText="t_nyukin_denpyo_buten_code" SortExpression="t_nyukin_denpyo_buten_code" />
                        <asp:BoundField DataField="t_nyukin_denpyo_atsukai_sha_code" HeaderText="t_nyukin_denpyo_atsukai_sha_code" SortExpression="t_nyukin_denpyo_atsukai_sha_code" />
                        <asp:BoundField DataField="t_nyukin_denpyo_atsukai_sha_mei" HeaderText="t_nyukin_denpyo_atsukai_sha_mei" SortExpression="t_nyukin_denpyo_atsukai_sha_mei" />
                        <asp:BoundField DataField="t_nyukin_denpyo_kokyaku_code" HeaderText="t_nyukin_denpyo_kokyaku_code" SortExpression="t_nyukin_denpyo_kokyaku_code" />
                        <asp:BoundField DataField="t_nyukin_denpyo_kokyaku_mei_kanji" HeaderText="t_nyukin_denpyo_kokyaku_mei_kanji" SortExpression="t_nyukin_denpyo_kokyaku_mei_kanji" />
                        <asp:BoundField DataField="t_nyukin_denpyo_kokyaku_mei_kana" HeaderText="t_nyukin_denpyo_kokyaku_mei_kana" SortExpression="t_nyukin_denpyo_kokyaku_mei_kana" />
                        <asp:BoundField DataField="t_nyukin_denpyo_PWM_furikomisaki_shiten_code" HeaderText="t_nyukin_denpyo_PWM_furikomisaki_shiten_code" SortExpression="t_nyukin_denpyo_PWM_furikomisaki_shiten_code" />
                        <asp:BoundField DataField="t_nyukin_denpyo_virtual_koza_no" HeaderText="t_nyukin_denpyo_virtual_koza_no" SortExpression="t_nyukin_denpyo_virtual_koza_no" />
                        <asp:BoundField DataField="t_nyukin_denpyo_kingaku" HeaderText="t_nyukin_denpyo_kingaku" SortExpression="t_nyukin_denpyo_kingaku" />
                        <asp:BoundField DataField="t_nyukin_denpyo_himoduke" HeaderText="t_nyukin_denpyo_himoduke" SortExpression="t_nyukin_denpyo_himoduke" />
                        <asp:BoundField DataField="t_nyukin_denpyo_furikomi_nyukin_tsuchi_file_mei" HeaderText="t_nyukin_denpyo_furikomi_nyukin_tsuchi_file_mei" SortExpression="t_nyukin_denpyo_furikomi_nyukin_tsuchi_file_mei" />
                        <asp:BoundField DataField="t_nyukin_denpyo_shori_ymd_time" HeaderText="t_nyukin_denpyo_shori_ymd_time" SortExpression="t_nyukin_denpyo_shori_ymd_time" />
                        <asp:BoundField DataField="t_nyukin_denpyo_nyukin_kanjo_ymd" HeaderText="t_nyukin_denpyo_nyukin_kanjo_ymd" SortExpression="t_nyukin_denpyo_nyukin_kanjo_ymd" />
                        <asp:BoundField DataField="t_nyukin_denpyo_nyukin_kisan_ymd" HeaderText="t_nyukin_denpyo_nyukin_kisan_ymd" SortExpression="t_nyukin_denpyo_nyukin_kisan_ymd" />
                        <asp:BoundField DataField="t_nyukin_denpyo_shimuke_ginko_mei" HeaderText="t_nyukin_denpyo_shimuke_ginko_mei" SortExpression="t_nyukin_denpyo_shimuke_ginko_mei" />
                        <asp:BoundField DataField="t_nyukin_denpyo_shimuke_shiten_mei" HeaderText="t_nyukin_denpyo_shimuke_shiten_mei" SortExpression="t_nyukin_denpyo_shimuke_shiten_mei" />
                        <asp:BoundField DataField="t_nyukin_denpyo_torikeshi_kubun" HeaderText="t_nyukin_denpyo_torikeshi_kubun" SortExpression="t_nyukin_denpyo_torikeshi_kubun" />
                    </Columns>
                </asp:GridView>
                <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:honbanConnectionString4 %>" SelectCommand="SELECT * FROM [t_nyukin_denpyo]"></asp:SqlDataSource>
                <br />
            </div>
        </form>
    </body>
    </html>
    

    2018年4月20日 10:13
  • 問題を再現するのに必要最低限とお願いしましたが、SqlDataSource とかは不要では?

    問題を再現するのに不要なものをどんどん削っていってください。意味もなくそういうことをお願いしているわけではないです。それが、問題の原因を切り分けていくのに有効だからです。それを行う過程で問題の原因が分かって、自己解決できるかもしれません。

    2018年4月20日 10:41
  • ちょっと考えてみました。多分以下のような話だと思います。

    > RequiredFieldValidatorが働かず、TextBoxへの入力がないまま、参照キー:「Null」でDBにアクセスしてしまい、サーバーエラーになります。

    ボタンクリックでクライアント側での検証がかからずポストバックされるので(クライアント側で検証がかかる場合は検証 NG ならポストバックはキャンセルされる)、サーバー側で GridView1_GetData メソッドの引数 from_date にモデルバインドされる際 null が渡されるが、メソッドの定義は以下のようになっており null を渡すことができないので、そこでエラーになっていると思われます。

    public IQueryable<t_nyukin_denpyo> GridView1_GetData(
            [Control("TextBox1")] DateTime from_date,
            [Control("TextBox2")] DateTime to_date
            )

    ASP.NET 4.5 からは以下の記事にあるように ScriptManager が変更されているそうです。

    ASP.NET 4.5 ScriptManager Improvements in WebForms
    https://blogs.msdn.microsoft.com/webdev/2012/09/21/asp-net-4-5-scriptmanager-improvements-in-webforms/

    どうも、ScriptManager を配置しない場合は従来通り検証コントロールが検証用クライアントスクリプトをダウンロードさせるが、ScriptManager を配置した場合は上の記事に書いてあるような設定を行わないと必要なクライアントスクリプトはダウンロードされないようです。

    ちなみに、上の私のレスで検証した際、

    > MasterPage はテンプレートで自動生成されたもの。

    と書きましたが、その MasterPage には ScriptManager が含まれており、それには上の記事で紹介したようにクライアントスクリプトがダウンロードされる設定がされています。

    解決策は:

    (1) クライアント側での検証スクリプトがダウンロードされるよう ScriptManager を設定する。

    (2) ブラウザでクライアントスクリプトを無効にされると同じ問題が出るので、GridView1_GetData メソッドの引数を null 可(DateTime ⇒ DataTime?)に変更する。そして、null だった場合の処置を追加する。

    でよさそうです・・・が、明日検証して確認してみます。

    質問者さんの方でもコードを必要最低限に削ってやってみてください


    • 編集済み SurferOnWww 2018年4月20日 14:55 誤記訂正
    2018年4月20日 14:02
  • 上の私のレスで、

    > 明日検証して確認してみます。

    と書きましたが、自分の環境では ScriptManager の設定・使い方によってはクライアント側での検証が動かないことは確認できました。

    質問者さんの環境でクライアント側での検証が動いているか否か確認してください。


    • 編集済み SurferOnWww 2018年4月22日 10:13 訂正
    2018年4月22日 9:38
  • SurferOnWwwさん、解決策をお教えくださりありがとうございます。

    教えて頂いたWebSite「ASP.NET 4.5 ScriptManager Improvements in WebForms」を参照し、aspxのheadに、jquery参照を追加したところ、TextBoxへの日付入力がない場合でも、検証が働き、「null」で、DBを参照にいくことがなくなりました。そして、今まで、Global.asaxのApplication_Startに入れていた、jquery参照はコメントアウトできました。
    ただ、未だ、例外がスローされる原因は確認中です。

    Validation_NoMaster01.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Validation_NoMaster01.aspx.cs" Inherits="Validation_NoMaster01" %>
    
    <!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="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.js" type="text/javascript"></script>
            <script type="text/javascript">
                //<![CDATA[
                (window.jQuery) || document.write('<script type="text/javascript" src="Scripts/jquery-3.3.1.js"><\/script>');//]]>
            </script>
    
            <script src="https://ajax.aspnetcdn.com/ajax/jquery.ui/1.12.1/jquery-ui.js" type="text/javascript"></script>
            <script type="text/javascript">
                //<![CDATA[
                (window.jQuery) || document.write('<script type="text/javascript" src="Scripts/jquery-ui-1.12.1.js"><\/script>');//]]>
            </script>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:ScriptManager ID="ScriptManager1" runat="server">
                    <Scripts>
                <asp:ScriptReference Name="jquery" />
                <asp:ScriptReference Name="jquery.ui.combined" />            
            </Scripts>
            
                </asp:ScriptManager>
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
                <br />
                <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="RequiredFieldValidator" SetFocusOnError="True"></asp:RequiredFieldValidator>
                <br />
                <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
                <br />
                <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="t_nyukin_denpyo_id" SelectMethod="GridView1_GetData">
                    <Columns>
                        <asp:BoundField DataField="t_nyukin_denpyo_id" HeaderText="t_nyukin_denpyo_id" InsertVisible="False" ReadOnly="True" SortExpression="t_nyukin_denpyo_id" />
                        <asp:BoundField DataField="t_nyukin_denpyo_shori_ymd" HeaderText="t_nyukin_denpyo_shori_ymd" SortExpression="t_nyukin_denpyo_shori_ymd" />
                        <asp:BoundField DataField="t_nyukin_denpyo_buten_code" HeaderText="t_nyukin_denpyo_buten_code" SortExpression="t_nyukin_denpyo_buten_code" />
                        <asp:BoundField DataField="t_nyukin_denpyo_atsukai_sha_code" HeaderText="t_nyukin_denpyo_atsukai_sha_code" SortExpression="t_nyukin_denpyo_atsukai_sha_code" />
                        <asp:BoundField DataField="t_nyukin_denpyo_atsukai_sha_mei" HeaderText="t_nyukin_denpyo_atsukai_sha_mei" SortExpression="t_nyukin_denpyo_atsukai_sha_mei" />
                        <asp:BoundField DataField="t_nyukin_denpyo_kokyaku_code" HeaderText="t_nyukin_denpyo_kokyaku_code" SortExpression="t_nyukin_denpyo_kokyaku_code" />
                        <asp:BoundField DataField="t_nyukin_denpyo_kokyaku_mei_kanji" HeaderText="t_nyukin_denpyo_kokyaku_mei_kanji" SortExpression="t_nyukin_denpyo_kokyaku_mei_kanji" />
                        <asp:BoundField DataField="t_nyukin_denpyo_kokyaku_mei_kana" HeaderText="t_nyukin_denpyo_kokyaku_mei_kana" SortExpression="t_nyukin_denpyo_kokyaku_mei_kana" />
                        <asp:BoundField DataField="t_nyukin_denpyo_PWM_furikomisaki_shiten_code" HeaderText="t_nyukin_denpyo_PWM_furikomisaki_shiten_code" SortExpression="t_nyukin_denpyo_PWM_furikomisaki_shiten_code" />
                        <asp:BoundField DataField="t_nyukin_denpyo_virtual_koza_no" HeaderText="t_nyukin_denpyo_virtual_koza_no" SortExpression="t_nyukin_denpyo_virtual_koza_no" />
                        <asp:BoundField DataField="t_nyukin_denpyo_kingaku" HeaderText="t_nyukin_denpyo_kingaku" SortExpression="t_nyukin_denpyo_kingaku" />
                        <asp:BoundField DataField="t_nyukin_denpyo_himoduke" HeaderText="t_nyukin_denpyo_himoduke" SortExpression="t_nyukin_denpyo_himoduke" />
                        <asp:BoundField DataField="t_nyukin_denpyo_furikomi_nyukin_tsuchi_file_mei" HeaderText="t_nyukin_denpyo_furikomi_nyukin_tsuchi_file_mei" SortExpression="t_nyukin_denpyo_furikomi_nyukin_tsuchi_file_mei" />
                        <asp:BoundField DataField="t_nyukin_denpyo_shori_ymd_time" HeaderText="t_nyukin_denpyo_shori_ymd_time" SortExpression="t_nyukin_denpyo_shori_ymd_time" />
                        <asp:BoundField DataField="t_nyukin_denpyo_nyukin_kanjo_ymd" HeaderText="t_nyukin_denpyo_nyukin_kanjo_ymd" SortExpression="t_nyukin_denpyo_nyukin_kanjo_ymd" />
                        <asp:BoundField DataField="t_nyukin_denpyo_nyukin_kisan_ymd" HeaderText="t_nyukin_denpyo_nyukin_kisan_ymd" SortExpression="t_nyukin_denpyo_nyukin_kisan_ymd" />
                        <asp:BoundField DataField="t_nyukin_denpyo_shimuke_ginko_mei" HeaderText="t_nyukin_denpyo_shimuke_ginko_mei" SortExpression="t_nyukin_denpyo_shimuke_ginko_mei" />
                        <asp:BoundField DataField="t_nyukin_denpyo_shimuke_shiten_mei" HeaderText="t_nyukin_denpyo_shimuke_shiten_mei" SortExpression="t_nyukin_denpyo_shimuke_shiten_mei" />
                        <asp:BoundField DataField="t_nyukin_denpyo_torikeshi_kubun" HeaderText="t_nyukin_denpyo_torikeshi_kubun" SortExpression="t_nyukin_denpyo_torikeshi_kubun" />
                    </Columns>
                </asp:GridView>
    
                <br />
            </div>
        </form>
    </body>
    </html>
    


    Global.asax

    <%@ Application Language="C#" %>
    
    <script runat="server">
    
        void Application_Start(object sender, EventArgs e)
        {
            // アプリケーションのスタートアップで実行するコードです
            // アプリケーションのスタートアップで実行するコードです
            //ScriptManager.ScriptResourceMapping.AddDefinition("jquery",
            //new ScriptResourceDefinition
            //{
            //    Path = "http://ajax.microsoft.com/ajax/jQuery/" +
            //    "jquery-1.10.2.min.js",
            //    DebugPath = "http://ajax.microsoft.com/ajax/" +
            //    "jQuery/jquery-1.10.2.js"
            //});
    
            //string str = "3.3.1";
            //ScriptManager.ScriptResourceMapping.AddDefinition("jquery", new ScriptResourceDefinition
            //{
            //    Path = "~/Scripts/jquery-" + str + ".min.js",
            //    DebugPath = "~/Scripts/jquery-" + str + ".js",
            //    CdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-" + str + ".min.js",
            //    CdnDebugPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-" + str + ".js",
            //    CdnSupportsSecureConnection = true,
            //    LoadSuccessExpression = "window.jQuery"
            //});
    
            //string str2 = "1.12.1";
            //ScriptManager.ScriptResourceMapping.AddDefinition("jquery.ui.combined", new ScriptResourceDefinition
            //{
            //    Path = "~/Scripts/jquery-ui-" + str2 + ".min.js",
            //    DebugPath = "~/Scripts/jquery-ui-" + str2 + ".js",
            //    CdnPath = "http://ajax.aspnetcdn.com/ajax/jquery.ui/" + str2 + "/jquery-ui.min.js",
            //    CdnDebugPath = "http://ajax.aspnetcdn.com/ajax/jquery.ui/" + str2 + "/jquery-ui.js",
            //    CdnSupportsSecureConnection = true
            //});
    
        }
    
        void Application_End(object sender, EventArgs e)
        {
            //  アプリケーションのシャットダウンで実行するコードです
    
        }
    
        void Application_Error(object sender, EventArgs e)
        {
            // ハンドルされていないエラーが発生したときに実行するコードです
    
        }
    
        void Session_Start(object sender, EventArgs e)
        {
            // 新規セッションを開始したときに実行するコードです
    
        }
    
        void Session_End(object sender, EventArgs e)
        {
            // セッションが終了したときに実行するコードです。
            // メモ: Session_End イベントは、Web.config ファイル内で sessionstate モードが
            // InProc に設定されているときにのみ発生します。session モードが StateServer か、または 
            // SQLServer に設定されている場合、このイベントは発生しません。
    
        }
    
    </script>
    

    出力(例外がスロー)

    'iexplore.exe' (スクリプト): 'スクリプト コード (Windows Internet Explorer)' が読み込まれました。
    例外がスローされました 下記ソースコードの行 1316、列 4 で発生しました。http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.js
    0x800a139e - JavaScript 実行時エラー: SyntaxError
    例外がスローされました 下記ソースコードの行 1334、列 4 で発生しました。http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.js
    0x800a139e - JavaScript 実行時エラー: SyntaxError
    プログラム '[17060] iexplore.exe' はコード 0 (0x0) で終了しました。
    プログラム '[11408] iisexpress.exe' はコード 0 (0x0) で終了しました。

    2018年4月23日 9:01
  • > 教えて頂いたWebSite「ASP.NET 4.5 ScriptManager Improvements in WebForms」を参照し、aspxのheadに、jquery参照を追加したところ、

    紹介した記事に書いてある手順と全然違うように見えます。

    とにかく、やってることが普通じゃないです。(はっきり言うとメチャクチャ)

    ASP.NET Web アプリのプロジェクトを作るときテンプレートは利用したのですか? テンプレートを利用すればスクリプト関係の問題は起きないはずです。できたコードには紹介した記事の処置は織り込み済みになります。

    一番最初に Visual Studio でプロジェクトのベースを作るときにどのような手順で行ったのか詳しく書いてください。

    あと、前にもお願いしましたけどコメントアウトしたコードは載せないでください。見づらくなるだけです。


    • 編集済み SurferOnWww 2018年4月23日 9:35 訂正
    2018年4月23日 9:32
  • 「プロジェクトのベース」がツールを貼り付ける前までだとすると、下のように行いました。

    1.Visual Studioの「ファイル」タブから、「新規作成」→「プロジェクト」

    2.「ASP.Net Web 空の Web サイト」を選択

    3.Visual Studioの「Web サイト」タブから、「新しい項目の追加」を選び、「Web フォーム」を選択

    2018年4月24日 4:24
  • > 2.「ASP.Net Web 空の Web サイト」を選択

    Visual Studio Community 2015 と同じ結果になるとすると(2017 は持ってないので未確認です)、「空」ではスクリプトマッピング関係の設定が一切されないです。

    「ASP.NET Web フォームサイト」で作ると、先に紹介した記事「ASP.NET 4.5 ScriptManager Improvements in WebForms」の設定はすべて織り込み済みになると思います(これも、2017 は持ってないので未確認ですが)

    ここであれこれ説明する前に、その違いを自分の目で見てもらった方がよさそうです。まず「ASP.NET Web フォームサイト」で作ってみてください。

    話はそれを見てもらった後にした方がよさそうです。

    2018年4月24日 6:27
  • 「ASP.NET Web フォームサイト」で作ったところ、検証コントロールが働きました。「GridViewあり&ScriptManagerあり」の状況であったにもかかわらず。また、かつ、特にHTMLソースをいじることなく。

    「ASP.Net Web 空の Web サイト」から作成したときには、「GridViewあり&ScriptManagerあり」の場合は、HTMLソースの小細工編集をしなければ、検証コントロールが働かなかったのに。

    ありがとうございます。
    • 編集済み Herokey 2018年4月24日 8:51
    2018年4月24日 7:58
  • > 「ASP.Net Web 空の Web サイト」から作成したときには、「GridViewあり&ScriptManagerあり」の場合は、HTMLソースの小細工編集をしなければ、検証コントロールが働かなかったのに。

    それは前にも書きましたが、「空」ではスクリプトマッピング関係の設定が一切されないからでしょう。

    「ASP.Net Web 空の Web サイト」から作成したときには、マスターページには以下のような ScriptManager が含まれていると思いますが、マスターページを使わない .aspx ページにも必ず以下の <Scripts> ~ </Scripts> の間のコードを含めた ScriptManager が全ページに配置されるようにしてください。

    <body>
        <form runat="server">
            <asp:ScriptManager runat="server">
                <Scripts>
                    <%--ScriptManager のバンドル スクリプトの詳細については、http://go.microsoft.com/fwlink/?LinkID=301884 を参照してください --%>
                    <%--Framework スクリプト--%>
                    <asp:ScriptReference Name="MsAjaxBundle" />
                    <asp:ScriptReference Name="jquery" />
                    <asp:ScriptReference Name="bootstrap" />
                    <asp:ScriptReference Name="respond" />
                    <asp:ScriptReference Name="WebForms.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebForms.js" />
                    <asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebUIValidation.js" />
                    <asp:ScriptReference Name="MenuStandards.js" Assembly="System.Web" Path="~/Scripts/WebForms/MenuStandards.js" />
                    <asp:ScriptReference Name="GridView.js" Assembly="System.Web" Path="~/Scripts/WebForms/GridView.js" />
                    <asp:ScriptReference Name="DetailsView.js" Assembly="System.Web" Path="~/Scripts/WebForms/DetailsView.js" />
                    <asp:ScriptReference Name="TreeView.js" Assembly="System.Web" Path="~/Scripts/WebForms/TreeView.js" />
                    <asp:ScriptReference Name="WebParts.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebParts.js" />
                    <asp:ScriptReference Name="Focus.js" Assembly="System.Web" Path="~/Scripts/WebForms/Focus.js" />
                    <asp:ScriptReference Name="WebFormsBundle" />
                    <%--サイト スクリプト--%>
                </Scripts>
            </asp:ScriptManager>
    
    ・・・以下略・・・

    単に <asp:ScriptManager runat="server"></asp:ScriptManager> としてはダメです。

    問題が解決して他に質問がなければこのスレッドはクローズ願います。



    • 編集済み SurferOnWww 2018年4月24日 9:18 訂正
    2018年4月24日 9:10
  • > また、かつ、特にHTMLソースをいじることなく。

    先の私のレスに書いた下記の内 (2) も忘れないように処置してください。今は (1) が解決できただけです。根本的な問題は (2) です。

    (1) クライアント側での検証スクリプトがダウンロードされるよう ScriptManager を設定する。

    (2) ブラウザでクライアントスクリプトを無効にされると同じ問題が出るので、GridView1_GetData メソッドの引数を null 可(DateTime ⇒ DataTime?)に変更する。そして、null だった場合の処置を追加する。

    2018年4月24日 9:15
  • もし「空」のテンプレートで作った ASP.NET Web Forms アプリをそのまま使いたいという場合は、

    (1) Visual Studio の NuGet パッケージの管理画面を開き、以下の NuGet パッケージをインストールし(もし Bootstrap 等も必要でしたらそれも)、

    ・AspNet.ScriptManager.jQuery
    ・Microsoft.AspNet.ScriptManager.MsAjax
    ・Microsoft.AspNet.ScriptManager.WebForms
    ・Microsoft.AspNet.Web.Optimization
    ・Microsoft.AspNet.Web.Optimization.WebForms

    (2) 「Web フォーム」のテンプレートで自動生成される App_Start フォルダの BundleConfig.cs のコードを参考にバンドル定義を作成し、

    (3) 上のバンドル定義を Global.asax の Application_Start メソッドで登録し、

    (4) 「Web フォーム」のテンプレートで自動生成されるマスターページのコードを参考に、ScriptManager にスクリプトを登録してください。

    詳しくは以下の記事を見てください。

    ASP.NET 4.5 スクリプト マッピング
    http://surferonwww.info/BlogEngine/post/2018/04/24/aspnet-45-script-resource-mapping.aspx

    • 回答としてマーク Herokey 2018年4月25日 8:46
    2018年4月25日 2:16
  • Surferさん

    Visual Studio Professional 2017 で、「ASP.NET Web フォーム サイト」から作成したら、「Site.master」に、教えて頂いた「ScriptReference」が入った ScriptManager が、作成されることを確認できました。
    そして、「ASP.NET Web フォーム サイト」は色々なテンプレートが入っているので、まずは、「ASP.NET Web フォーム サイト」から不要部分を削除して(必要なものを削除してしまわないか心配なのですが)目的のサイトを作成してみます。そして、機会があれば、これまた教えて頂いた手順(1)から(4)を使って、「ASP.NET 空の Web サイト」から作成する方法もやってみたいと考えています。

    長々とお付き合いありがとうございました。大変勉強になりました。記事「ASP.NET 4.5 スクリプト マッピング」も分かり易かったです。


    • 編集済み Herokey 2018年4月25日 8:45
    2018年4月25日 8:45
  • くどいようで何ですが、先の私のレスに書いた下記の (2) も忘れないように処置してください。今までの話は (1) のことしか考えておられないようですが、(2) の方が 100 倍ぐらい重要です。

    (1) クライアント側での検証スクリプトがダウンロードされるよう ScriptManager を設定する。

    (2) ブラウザでクライアントスクリプトを無効にされると同じ問題が出るので、GridView1_GetData メソッドの引数を null 可(DateTime ⇒ DataTime?)に変更する。そして、null だった場合の処置を追加する。

    2018年4月25日 11:15
  • お心遣いありがとうございます。

    実は、とりあえず、(2)は対策しない積りなのです。やはり、分かっちゃいますね。すみません、黙っていて。

    というのは、社内システムで、かつ、基本的にブラウザーの設定はデフォルトのJavaScriptが動く設定になっているためです。そして、JavaScriptが動かない設定になっていたために落ちちゃった場合は、JavaScriptが動く設定にすれば良いと考えているのと、「RangeValidator」や「ValidationSummary」も入れると、プログラミングが嵩んじゃうと考えているからです。

    しかし、今後のプログラミングを考えると、nullの処理が出来るようになっておいた方が良いですね。

    ところで、(2)のnullの処置をしたら、(1)の処置は不要になりますか?

    2018年4月26日 1:32
  • 上のレスを拝見すると、ASP.NET Web アプリの基本を知らないがゆえに、とんでもなく見当違いのことを考えているように思えます。

    とにかく、

    > 実は、とりあえず、(2)は対策しない積りなのです。

    そんなことは 1 ミリも考えず、私のアドバイスを聞いて、あくまで基本に忠実にやることをお勧めします。

    今回の場合、基本に忠実にというのは、「クライアント側の検証はユーザーが無効にできる。故に無効になることは普通にあるという前提で考える。無効になった場合の対応をしておく」ことです。


    >(2)のnullの処置をしたら、(1)の処置は不要になりますか?

    そんなことはないです。両方対処すべきです。

    ユーザー入力の検証をクライアント側で行うのは、入力が無効なのにいちいちポストバックされるという煩わしさからユーザーを開放するため、すなわちユーザビリティの向上のためです。

    クライアント側での検証は無効になってもサーバー側での検証は行われるので、「検証」ということだけに関してはクライアント側での検証は無くても動くとは言えますが、不要と言う話にはならないはずです。

    「検証」と null がモデルバインドされることによるエラーは別の話です。そこのところが理解できてないのでは?

    2018年4月26日 3:37
  • (2)の対策が必要なこと分かりました。ボタンクリックのイベントに、null入力で来た時の備えを入れようと思います。ご説明ありがとうございます。

    また、最後のお尋ねについては、「検証」コントロールでnullがはじかれなかったため、nullキーでDBを参照することになってしまい、DB参照のエラーが発生したものと考えています。

    2018年4月26日 8:35
  • 私のレスを理解していただいてないように思います。読んでもらっていないような気もするのですが・・・

    > (2)の対策が必要なこと分かりました。ボタンクリックのイベントに、null入力で来た時の備えを入れようと思います。ご説明ありがとうございます。

    それでは対策になりません。先の私のレスで「GridView1_GetData メソッドの引数を null 可(DateTime ⇒ DataTime?)に変更する」と書きましたけど、そこは理解してますか? 読んでもらえましたか?

    これも前に書きましたが、サーバー側で GridView1_GetData メソッドの引数 from_date にモデルバインドされる際 null が渡されるが、メソッドの定義は以下のようになっており null を渡すことができないので、そこでエラーになったということです。(TextBox を空白にすると null が渡されます)

    public IQueryable<t_nyukin_denpyo> GridView1_GetData(
            [Control("TextBox1")] DateTime from_date,
            [Control("TextBox2")] DateTime to_date
            )

    「GridView1_GetData メソッドの引数を null 可(DateTime ⇒ DataTime?)に変更する」というのは、単に以下のようにすればいいです。

    public IQueryable<t_nyukin_denpyo> GridView1_GetData(
            [Control("TextBox1")] DateTime? from_date,
            [Control("TextBox2")] DateTime? to_date
            )

    モデルバインドの際にエラーになるので、ボタンクリックのイベントハンドラや GridView1_GetData メソッドの中では何ともならないはずです。

    > また、最後のお尋ねについては、「検証」コントロールでnullがはじかれなかったため、nullキーでDBを参照することになってしまい、DB参照のエラーが発生したものと考えています。

    違います。上にも書きましたが、問題は GridView1_GetData メソッドの引数に null が渡されることで、Linq to Entities のクエリ以前の問題です。

    ちなみに、クエリに null を渡すと、その条件ではレコードは一行も抽出できず、空の IQueryable<t_nyukin_denpyo> が返されるはずです。エラーにはならず、GridView には何も表示されないという結果になるはずです。

    次回また質問する機会がありましたら、それまでには少なくとも掲示板で話が通じるレベルの知識を身に着けていただくようお願いします。

    2018年4月26日 9:07
  • 「DateTime ⇒ DataTime?」は読みましたが、分かっていませんでした。「DateTime?」という型があることを知りませんでした。説明を簡略化する為に、「DateTime?」と書かれていると決めつけていました。

    そして、「DateTime?」を使い、クライアントのJavaScriptを無効にしたところ、レコードは表示されず、「RequiredFieldValidator」が表示されました。それにより、少し理解が進みました。親切にありがとうございました。

    また、知識をつけるため、次は「独習ASP.NET」辺りを読んでみようかなと考えています。

    2018年4月27日 5:50