9

MVC3に付属している控えめな検証を利用して、jQuery Mobile (Alpha 3)ベースのASP.NET MVC 3アプリケーションを作成しています。ページに直接アクセスすると(URLにハッシュがない)、検証は完全に機能します。しかし、ページに移動すると、jQuery MobileはAjaxナビゲーションを使用して動的にロードし(Urlにハッシュを表示)、検証が機能しなくなります。ここでjQueryモバイルと目立たない検証

は、使用中のコードのサンプルです:

モデル:

[Required(ErrorMessage = "Missing value")] 
[DisplayName("Property Display Name")] 
public int? PropertyName { get; set; } 

ビュー(レイザー):生成

@Html.LabelFor(model => model.PropertyName) 
@Html.TextBoxFor(model => model.PropertyName) 
@Html.ValidationMessageFor(model => model.PropertyName) 

HTML:

<label for="PropertyName">Property Display Name</label> 
<input data-val="true" data-val-number="The field Property Display Name must be a number." data-val-required="Missing value" id="PropertyName" name="PropertyName" type="text" value="" /> 
<span class="field-validation-valid" data-valmsg-for="PropertyName" data-valmsg-replace="true"></span> 

他のページが以前にロードされていて、HTML要素が一意のIDを持たない可能性があります。 Label、TextBox、およびValidationMessageのHTMLを生成するために独自のHTMLヘルパークラスをローリングする以外に、このシナリオを処理する方法はありますか?

+0

私はJQMでのユニークIDを疑問に思い、それはまだ私を悩まします。 JQMの著者自身はそれについてあまり言わない。私は、IDが重複している既存のフッターの例を見ていました。私は2つの解決方法を見ています - あなた自身のIDの世話をするか、新しいページがロードされているときにDOMから離したページを強制的に削除してJQMキャッシングを破棄します - 'pagebeforecreate'イベント – naugtur

+0

私たちは同様の問題を抱えていますが、それはまったく働いている。我々はjQ 1.5とjQM 1.03aを利用しています。ここに苦しんで.. – pavsaund

答えて

5

新しいコンテンツが読み込まれた後にjQuery.validator.unobtrusive.parse()に電話しましたか? Brad Wilsonのブログでthis postを読んでください。

14

私はこの同じ問題で少し苦労しましたが、@ Zoteは正しい方向に私を指摘しました。

parse()は行くが、セレクタすなわちに合格することを確認する方法です:

jQuery.validator.unobtrusive.parse("form") 

または

jQuery.validator.unobtrusive.parse(document) 

これをフックする最良の方法は、JQMs pageshowイベントを通じて、おそらくです。そう、あなたはまたjqmが、それは.ui-page-activeを使用することによりpagebeforeshowイベント

$('div').live('pageshow',function(event){ 
    jQuery.validator.unobtrusive.parse(".ui-page-active form"); 
}); 

を使用することにより、同様のページ上の魔法だ行っている前にこれを行うことを好むことのようにこれは、あなたは、それぞれの新しいページ遷移後にトリガーされます現在アクティブなページに絞り込みます。

+1

これは答えとして受け入れられるはずです。 jQuery 1.7とjqm 1.2の最新コードは、$(document).on( 'pageinit'、 '#feedback_page'、function(e){ $ .validator.unobtrusive.parse($ this this.find 'フォーム ')); }); – TruMan1