2011-12-06 3 views
3

私は現在、多くのjQueryとhtmlフォームを使用しているMVCアプリケーションに取り組んでいます。しかし、最近私はこれらがお互いに矛盾しているように見えることを知りました...

たとえば、私のAJAX呼び出しを処理するためにフォームのデフォルト送信を防ぐ必要があります。 AJAXを使用してフォームを送信するアイデア。代わりに$.ajaxコールをに<input type="submit" />よりも呼び出すほうがいいですか?

したがって、ajaxによって送信されるフォームを持つことは矛盾しますか?

+0

「矛盾する」とはどういう意味ですか?矛盾していると思いますか? –

+0

ajax呼び出しを行う前にデフォルトを禁止しない限り、サブミットプロセスとajaxプロセスによるフォームの提出が互いに矛盾していると感じました。 – shuniar

+0

あなたのクライアントがAJAXをサポートしている場合、感謝メッセージを表示するか、何かのステータスを確認するために、新しいページ全体を取得するためにサーバーに往復する必要がありますか?私は自分自身の使用状況に応じて、AJAXを使用してデータを送信し、HTMLまたはJSONのいずれかを取り戻します。あなたがフォームのsubmitにDefaultを禁止しない限り、あなたは重複した投稿を得るでしょう。アイデアは、正常に劣化するようにコード化することです。フォームの送信にバインドし、AJAXが有効になっているかどうかを確認し、preventDefaultであるかどうかを確認してから、AJAXを実行します。 –

答えて

4

送信ボタンにajax呼び出しを行う理由は、ユーザーがJavaScriptを無効にしていると自然なフォールバックが発生するためです。リクエストがajaxリクエストかまっすぐに送信された場合はバックエンドロジックを検出し、ajaxの場合はデータを返信し、そうでない場合はリクエストを 'old school'の方法で処理できるようにする必要があります。

編集:コンテキストの場合。ユーザーがJavaScriptを無効にしている場合、あなたのjQueryのこの

$('form').bind('submit', function(e){ 
    e.preventDefault(); 
    //do your stuff 
}); 

ようになり

<form action="/processForm.php" method="POST"> 
    <input type="submit" value="submit" /> 
</form> 

その後、フォームは通常のよう/processForm.phpに提出します。

フォームがajaxを介して送信されたかどうかを検出するには、次のPHPを使用します(使用しているかどうかわかりませんが、これは私のものです)。

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    /* handle ajax here */ 
}else{ 
    /* handle normal submit here */ 
} 
+0

自然なフォールバックとして実装するにはどうすればよいのでしょうか?現在、アクションを防止して、フォールバックがないことを意味するajaxが優先されるようにする必要があります。例を挙げることは可能ですか? – shuniar

+1

ユーザーがJavaScriptを有効にしていない場合、標準フォームの送信を妨げるJSは起動しません。だからあなたは本当に何もする必要はありません。 – maxedison

+0

AJAXが有効かどうかを検出するには、$ .support.ajaxという完全な例が$( '#categoryFilter')になります。 *ここに私のAJAXを入れる* /}}); –

1

私はそれが「矛盾している」とは言いません。 ajaxを介してフォームを送信するときには、必ず<form>要素を使用する必要はありませんが、それでもセマンティック目的でフォームを使用したい場合があります。

はい、私はちょうどtype="submit"ではなく、<input type="button" />を使用したいと思います。そのような方法で、デフォルトのフォーム送信を防ぐ必要があるからです。

0

私はそうは思わない。

ユーザーがJavaScriptを有効にしていないときにフォールバックにすると、フォームがサーバーに送信され、ユーザーは引き続きユーザーのWebページを使用できます。

このため、バックエンドはajax呼び出しであることに注意する必要があります。 jQueryを使用しているのが分かります.jQuery ajaxはヘッダx_request_with: xmlhttprequestを送信します。バックエンドでPHPを使用している場合は、$_SERVER['http_x_request_with']でキャプチャできます。

0

あなたのやりたいことによって異なります。 一般的に言えば、私は、使用しようとして $ .ajax()との呼び出しを処理しますが、いつかasp.net mvcで動作しません。たとえば、ファイルをアップロードする場合は、asp.netの検証が失敗します。そのことを回避するために、私はajaxFormプラグインを使用し、それを使用して標準形式をラップします。

関連する問題