9

私はまだMVCの動作方法について多少混乱しています。現実世界のMVC - フォームの扱い

私はウィジェットを販売するウェブサイトを持っていると言います。私はリスティングページ/widgets/listと製品ページ/widgets/product/123を持っています。

これらの両方ともwidgetコントローラを使用して、listおよびproductメソッドを呼び出すことができます。私はまた、さまざまなもののためのいくつかの他のコントローラを持っていると言うことができます。

今すぐニュースレターのサインアップボックスを自分のヘッダー(サイトのすべてのページ)に追加します。 これはどのように機能しますか? /newsletter/signup

しかし、エラーが発生した場合(あなたのメールアドレスが正しく入力されなかった場合)はどうなりますか?表示されているページ(例:/widgets/list)は表示されますが、newsletterコントローラを実行する必要があります。 widgetコントローラはコントローラnewsletterを知らないので、コードをそこに置くことはできません...どうやってこれを動作させるのですか?

編集:いいえAJAXしてください - もっと簡単に理解できます。これはjavascriptが無効になっているときのフォールバックと考えてください。

編集2:この種のものをカバーする任意の例やチュートリアルがはるかに

編集3をいただければ幸いです。それは、アクションを呼び出すためのビューのために許容されますか?たとえば、ヘッダーはNewsletter->index()

答えて

0

と呼びます。エラーメッセージは、ページコントローラー(「サブコントローラー」newsletterを含む)が取り出せる場所に置く必要があります。

AJAXの場合、newsletterコントローラはDIVと表示されます(ページ全体をリロードしていないため)。そのためには、AJAXリクエストが終了したときに呼び出されるJavaScriptの部分がページに必要です。このリクエストは文字列を受け取り、必要な場所に配置します。

0

私のMVCの経験では、より実用的で「本が言う」小さいですが、ここに行く:

あなたは、CakePHPで(基本コントローラクラスを持っているだろう - 私が最もよく知っている何をしている - それはですAppControllerと呼ばれます)。これは他のすべてのコントローラによってサブクラス化されています。このクラスは、あなたが話しているすべての「グローバル」なものを実装します。

実施例:私のAppControllerクラスにおいて

、フレームワークは、各ページの負荷に実質的に実行されるbeforeFilter()コールバックを定義します。これは、申し込みフォームが提出されたかどうかを確認し、適切に処理するかどうかを確認するところです。サインアップが何とかやってしまった場合は、セッションに何かを追加して、私の見解ではニュースレターモデルからのエラーのリストが存在するかどうかをチェックし、もしあれば表示します。

あなたが求めていたよりも、これは理論上、おそらく少しナットとボルトに重いと軽いですが、私の最高のがありますので、私はこのがらくたのいずれかで正式な訓練を受けていない:)

1

にフィールドを追加します。現在のページのURLを格納するニュースレターフォーム。 ニュースレターの提出中にエラーが発生した場合、URLを取得してそのページにリダイレクトします。エラー情報を正しい場所に置くことを前提に、すべてのページに含まれているニュースレターフォームで取り上げる必要があります。

0

いくつかの検証エラーなどを返すと思われるウィジェットの場合 - partial requests(またはMvcContribのサブコン)+ AJAXを使用します。

0

私がしていることは、それぞれのフォームが自分自身に投稿されていることです。コントローラでは、ポスト変数が設定されているかどうかをチェックします。もしそうなら、私はバリデーションを行います。検証が成功すると、別のページにリダイレクトします。失敗した場合は、フォームページにエラーメッセージが再ロードされます。これにより、簡単にコードを複製することができます。参照:表示されているとおり、フローは常に単一のビューロードステートメントになります。ただし、検証が成功すると、別のページに移動します。

+0

5つのアクションを持つコントローラが10個ある既存のWebサイトを持っている場合、ヘッダーにニュースレターのサインアップを追加すると、50個の関数を編集する必要がありますか? – Greg

+0

それは別のページに投稿する例外です。ほとんどのフォームは複数のページには表示されず、ニュースレター、ログイン、多分登録のようなものだけが表示されます。全体的に、上記はかなり効果的です。 – ryeguy

6

すべてのページにあるニュースレターボックスのエラーメッセージが同じページに表示される理由がわかりません。現在のビューとは全く関係のない別のアクション(たとえば、検索)に投稿するページがある場合、エラーメッセージが元のページに表示される理由はありません。同じページに成功のメッセージを表示しますか?それはどこで処理されるだろうか?

ニュースレターフォームのエラーメッセージは、ニュースレター専用のビューに表示する必要があります。たとえば、Stackoverflowでどのように行われているのかを見てください。検索ボックスに入り、何も入力しないでEnterを押すだけです。これは、あなたが検索したいものを指定しなかったので、一種のエラーです。 Stackoverflowは検索の仕方を説明する別のページに移動します。

なぜそれができましたか?その理由は単純です。ユーザーはページ上にいて、現在のページに関係のない活動に従事することを選択したので、そこに置く理由はありません。

+0

OPが元のビューに戻ってくると思うかもしれませんが、私はおそらくあなたの提案したアプローチも選択します。 –

+2

これに追加するには:ユーザーが最後にどこにいたかの「マーカー」を保持するには、Cookieを使用するか、URLにクエリ文字列を追加します。例: '/ newsletter/signup?return_to = widgets/list' –

+0

+1私の見解では、ユーザーを別のコントローラにリダイレクトして成功/失敗を知らせることは完全にうまくできます。 –

0

/newsletter/signupコントローラに送信するページに隠しフィールドを追加する方法は、コントローラーの終了後のURL、つまり現在のページ(またはreferer httpヘッダーを使用することができます)を追加する方法です。

このコントローラーは、上記の非表示フィールドで指定されたコントローラーに転送する前に、エラーメッセージまたは成功メッセージのリストをビューでレンダリングされるオブジェクトのリストに追加します。このコントローラは、ビューに表示されるオブジェクトのリスト(ウィジェットのリストなど)を追加します。

次に、ニュースレターコントローラからのエラーメッセージを表示することができます。

1

MVC環境にウィジェット(再利用可能なコンポーネント)を含める方法を記述した良いASP.net MVCセントリックtutorialがあります。

基本的な考え方は、独自のリクエストパイプラインを使用してウィジェットをセットアップすることです。MVCの保守性を損なうコントローラーとビューを組み合わせて組み合わせることはできません。

関連する問題