teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

さらに追伸を追加

2016/10/30 01:59

投稿

退会済みユーザー
answer CHANGED
@@ -23,4 +23,60 @@
23
23
 
24
24
  なので、今回のような質問者さん自作の検証用スクリプトは必要ないと思うのですが・・・ そんなことは十分承知の上で今回のようなことをしていると言うことでしたら失礼しました。
25
25
 
26
- でも、もしそうでなければ、上記のデータ アノテーション検証を使うことを検討されることをオススメします。
26
+ でも、もしそうでなければ、上記のデータ アノテーション検証を使うことを検討されることをオススメします。
27
+
28
+ 【2016/10/30 11:00 追伸】
29
+
30
+ たびたびの追伸ですみません。多分以下の想像が当たりだと思います。
31
+
32
+ $("form").change(function (event) { ... はバブルアップしてきた input 要素の change イベントを捕捉しているようですが、スクリプトで書き込んだだけでは、そもそもの input 要素の change イベントが発生しないというのが原因でしょう。
33
+
34
+ input 要素の change イベントはユーザー入力後フォーカスが外れた時に発生します。しかし、スクリプトで書き込んだだけではその条件を満たさないので change イベントは発生しません。
35
+
36
+ 書き込んだ後、その input 要素の change イベントを発生させるスクリプトを追加すれば期待通りに動くと思います。
37
+
38
+ ASP.NET MVC も部分ビューも jQuery ajax も関係ない以下のようなシンプルなコードで質問者さんの問題を再現できます。(ブラウザにキャッシュされないよう、以下のサンプルは ASP.NET Web Forms の .aspx ページを使ってますが、そこは今回の話とは関係ないです)
39
+
40
+ 「// これがないとダメ」とコメントした下のコードのコメントアウトを外せば当該 input 要素の change イベントが発生するので、form にてバブルアップしてきた change イベントを捕捉できます。
41
+
42
+ 次からは是非ご自分で切り分けてみることをオススメします。切り分ける途中で原因が分かって自己解決できると思いますので。
43
+
44
+ ```
45
+ <%@ Page Language="C#" %>
46
+
47
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
48
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
49
+
50
+ <script runat="server">
51
+
52
+ </script>
53
+
54
+ <html xmlns="http://www.w3.org/1999/xhtml">
55
+ <head runat="server">
56
+ <title></title>
57
+ <script src="Scripts/jquery-1.11.1.js" type="text/javascript"></script>
58
+ <script type="text/javascript">
59
+ //<![CDATA[
60
+ $(function () {
61
+ $("form").change(function () {
62
+ alert("change event fired!");
63
+ });
64
+
65
+ $("#Button1").click(function () {
66
+ $("#Text1").val("Written by JavaScript");
67
+
68
+ // これがないとダメ
69
+ //$("#Text1").change();
70
+ });
71
+ });
72
+ //]]>
73
+ </script>
74
+ </head>
75
+ <body>
76
+ <form id="form1" runat="server">
77
+ <input id="Text1" type="text" />
78
+ <input id="Button1" type="button" value="button" />
79
+ </form>
80
+ </body>
81
+ </html>
82
+ ```

1

追伸追加

2016/10/30 01:59

投稿

退会済みユーザー
answer CHANGED
@@ -4,8 +4,23 @@
4
4
 
5
5
  MVC も部分ビューも問題とは直接関係なくて、ユーザーが画面のテキストボックスを手動で書き換えると定義してあるスクリプトが働くが、jQuery ajax を使って書き換えた場合はスクリプトが動かないというようなことだと理解しました。
6
6
 
7
- 全体のコードや再現手順が分からないので、当方としては想像をたくましくして考えしかないのですが、一つだけ思いつくのは jQuery ajax なのでデフォルトで非同期になり、そのあたりのタイミングの問題がありそうな気がします。
7
+ 全体のコードや再現手順が分からないので、当方としては想像をたくましくして考えしかないのですが、一つだけ思いつくのは jQuery ajax なのでデフォルトで非同期になり、そのあたりのタイミングの問題がありそうな気がします。
8
8
 
9
9
  その想像が当たっているなら、async オプションを false に設定すると何か違った結果になるかもしれません。
10
10
 
11
- 今提供されている情報で自分が想像できるのはその程度です。ハズレでしたらすみません。
11
+ 今提供されている情報で自分が想像できるのはその程度です。ハズレでしたらすみません。
12
+
13
+ 【2016/10/29 16:35 追伸】
14
+
15
+ 書き忘れましたが、async オプションを false に設定する場合は jqXHR.done() は使わないで、success, error, complete にコールバックを書けと言うことですので注意してください。詳しくは API Documentation を見てください。
16
+
17
+ http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings
18
+
19
+ もう一つ、ユーザー入力の検証には、Model のクラスのプロパティにデータアノテーション属性を付与すれば、クライアント側での検証用のスクリプトは ASP.NET が自動的に設定してくれますのでそれを使うのが一般的です。
20
+
21
+ [C#] #21. データ アノテーション検証コントロールでの検証
22
+ https://technet.microsoft.com/ja-jp/subscriptions/ff642519.aspx
23
+
24
+ なので、今回のような質問者さん自作の検証用スクリプトは必要ないと思うのですが・・・ そんなことは十分承知の上で今回のようなことをしていると言うことでしたら失礼しました。
25
+
26
+ でも、もしそうでなければ、上記のデータ アノテーション検証を使うことを検討されることをオススメします。