2012-02-28 12 views
1

これで、基本的にウィジェットとして連絡フォームであるオーチャードモジュールを作成しました。このウィジェットは、パーツとして(またはウィジェットとして)どのページにでも置くことができ、ポストデータを処理するコントローラにデータをポストします。電子メールを送信すると、入力を要約した「送信済み」ビューが返されます。私が持っている問題は、無効なモデルを扱うことです。私はコードをデバッグするので、検証に入るだけです。コントローラは、ウィジェットがあるページに動的に戻ります!ModelState.IsValid

if (!ModelState.IsValid) 
{ 
    //Gets here no problem 
} 

しかし、問題は、私のウィジェットは基本的に任意のページにすることができるので(グローバル領域では、別のページに、ホームページのすべてのページになる)、それはのウィジェットまたは一部にできることですタイプ。モデルを送信者のページに戻す方法はわかりません。私はいくつかの選択肢があると思っています。

興味深いのは、自分のサイトの「グローバル」領域にフォームを置くと(すべてのページにあるサイドバーのように、私の「送信済み」ページが重要です)、そのページのフォームは実際にフォーム上に「検証」エラーが表示されます。だから、どういうわけか私は明示的にそれを返さないと思っても、私のビューモデルをページに渡しています。

URLは何のサブドメインを持っていない場合a)はどういうわけかどういうわけか)ホームページコントローラまたは任意の(果樹園がそれをどのように処理するかわからない)

Bにし、我々のルートを、例えば、コントローラのアクションに送信者のURLをマップハンドラー/ドライバーの領域でやっても、どうすればいいのか分かりません。

c)むしろ、このようにしないでください。しかし、私のコントローラはjsonデータを返し、jquery経由で非同期のコントローラにフォームをポストするだけです。

答えて

-1

Javascriptが有効になっていないとき(またはJavascriptが無効のときにシステムが不具合であると受け入れることができるとき)にシステムが動作しなければならないという厳しい要件がない場合は、私は個人的にJSON/Ajaxの方法を使います。それに、AJAXがどんなサイトに行っているのか、あなたの側に素敵な振る舞いを与えます。

いずれに続いて、この例では、いくつかのJavascript(とjQueryを使用して、あなたはおそらくすでにこの実行している。

@* This is, of course, oversimplified for the sake keeping the post short. 
    I'd be happy to provide more details if you need'em *@ 
<form id="contact" action="@Url.Action("ContactWidget", "Send")" method="post"> 
{ 
    @Html.Textbox("name"); 
    @Html.TextArea("message"); 
    <input type="submit" value="Send" /> 
} 

、いずれかが動作するはずです(PartialViewまたはPartialActionとして連絡先ウィジェットをレンダリングする)。理想的には、別途付属中.jsファイル(このファイルを与えられ、それは.jsファイルがキャッシュ可能であるため、あなたのページのサイズ減らすだろう、すべてのサイト上になります)。

$('form#contact input[type=submit]').on('click', function() { 
    var form = $(this).closest('form'); 
    var data = form.serialize(); 
    var postURL = form.attr('action'); 

    // do the actual post 
    $.post(postURL, data, function (response) { 
     if (response) { 
      form.parent().html($(response)); 
     } 
    }); 

    return false; 
}); 

あなたが得ることに応答して、コンテンツのフォームのコンテナのを置き換えますあなたのPOSTコールから外してください。あなたが好きなようにあなたのコントローラの送信アクションを実装し、それが部分的なビューの内容で応答するようにすることができます。返されるHTMLが検証エラーのあるフォームと同じフォームか、「ありがとうございました」メッセージかは、あなた次第です。 それはJavascriptが有効になっていない場合でも、あなたのウィジェットは、あなたのウィジェットにフルブラウザのPOSTを行います

public ActionResult Send(SendViewModel model) 
{ 
    if (!ModelState.IsValid) 
     return View("Widget", model); // where "Widget" is the .cshtml with the form 

    // do the actual message sending... 

    // return a thank you note 
    return View("ThankYou"); // where "ThankYou" is the .cshtml with the Thank You message 
} 

注...のようなものかもしれないが、結果は唯一の連絡先フォームの出力になります。あなたが私を必要としない限り、私はこれには入りませんが、POSTを処理した後、Request.IsAjaxRequest()拡張機能とHttpReferrerを使って元のページにリダイレクトすることができます。