2

いくつかの異なる場所でフォーム送信を介して呼び出すことができる MVC コントローラーがあります。次にコントローラーは、ユーザーがドキュメントを送信したり外部サイトに投稿したり、通知メールで使用されるテキスト フィールドに入力できるようにすることを主な目的とするビューをレンダリングします。

これらのフィールドで検証を実行しています - ユーザーはカスタムの件名/本文テキストを入力できます。そうでない場合は、ポップアップ アラートが表示され、フォームに戻るか、プレースホルダー値に示されているデフォルトのテキストを使用してフォームを送信できます。

問題は、ユーザーが最初にこのページにアクセスして送信ボタンをクリックしたときに、テキスト ボックスへの入力が実際には登録されておらず、実際のフィールドの内容に関係なく、空の文字列の通知が表示されることです。ただし、F5 を押して再試行すると、入力は完全に機能します。

これは、最初にこのコントローラーを呼び出すフォーム送信が POST アクションを介して行われることに関係しているように感じますが、ページの更新時に GET を使用すると問題なく動作するようです。コントローラーが POST 経由で呼び出されたときにコンテンツを適切に応答させる方法、またはデータを投稿せずにフォームを送信する方法がわかりません。

読んで助けてくれてありがとう。

呼び出し元のコントローラーは次のとおりです。

    public ActionResult Index(FormCollection collection)
    {
        //modelbuilding code
        return View (Model);
    }

コントローラーを呼び出すコードは、常に次の形式を使用します: (この場合、受信者/インデックス ビューから呼び出されます。

@using(Html.BeginForm("Index", "Distribution", FormMethod.Post )) {
    //form values
    <input type="submit" data-role="button" value="Done"/>
}

ビューと JS 検証関数の関連部分は次のとおりです。

<div id="SubjectTemplate">
    <p>Subject: <input id="emailSubjectTextBox" name="EmailSubject" placeholder="@EmailSubject" /></p>
</div>

<a href="javascript:validateInput();">Send Notification</a>

<script>               
    function validateInput() {
         var possibleErrors = [];   
         if (!(document.getElementById('emailSubjectTextBox').value)) {
               possibleErrors.push('@incompleteEmailSubject' + '\n');
         }
         //more validation that works the same way and has the same problem
         if (possibleErrors.length > 0) {
             if (confirm(possibleErrors))
             {
               window.location.href = '@Url.Action("Send")'
             }
         }
         else {
               window.location.href = '@Url.Action("Send")'
         }
    }                
</script>
4

2 に答える 2

1

あなたの質問を完全に理解できるかどうかはわかりませんが、一般的に言って、POSTとGETに同じアクションを使用するべきではありません。

さらに重要なことに、アクションに何らかの副作用がない場合は、POSTを使用しないでください。フォームの送信で行っているのが何らかの選択を行うことだけである場合は、GETを使用する必要があります。

jQueryを使用してajaxGETリクエストを実行する方法の詳細と例については、次の投稿を参照してください。http ://www.jquery4u.com/ajax/key-differences-post/

何をしようとしているかに関係なく、POST呼び出しで何らかのアクションを実行してから、ユーザーに戻るGETアクションにリダイレクトすることをお勧めします。

[HttpPost]
public ActionResult Index(FormCollection collection)
{
    //do whatever you need to save the record
    return RedirectToAction("Index")
}

[HttpGet]
public ActionResult Index()
{
    //modelbuilding code
    return View (Model);
}

これは、コントローラーがRESTful手法に準拠するのに役立つだけでなく、ユーザーがf5キーを押した場合に、ユーザーが「このページを再送信してもよろしいですか」という煩わしさを感じるのを防ぎます。

お役に立てれば。

于 2012-12-03T19:10:12.573 に答える
0

この問題は、jQueryMobile が自動的に AJAX を利用してフォームを投稿したことが原因であることがわかりました。ステートメントに含めるnew {data_ajax = "false"}ことでこれを解決しました。Html.BeginForm

于 2012-12-04T21:45:59.180 に答える