2011-11-08 14 views
1

私はGooglePlexで高低を検索していましたが、ここではMVC3のクライアント側の妥当性チェック要素を呼び出さないサンプルMVC3ウィザード(マルチステップ) jQuery)。私はここでいくつかの要素の少なくとも1つの詳細な説明を見た:multi-step registration process issues in asp.net mvc (splitted viewmodels, single model)、しかし私はそれが正しく動作するように取得することができませんでした。サンプルMVC3ウィザードアプリケーション(複数ステップ)

一般的にMVC3やプログラミングには触れていないので、私は自分の経験レベルがそれが動作するのを妨げていると思っています。

とにかく、Jquery以外のMVC3ウィザードサンプルへのガイダンスは素晴らしいものです。前もって感謝します。

+1

「no jQuery」要件について詳しく説明できますか? JavaScriptは許可されていますか? JavaScriptライブラリやフレームワークは許可されていますか? – David

+0

@David迅速な対応に感謝します。私はOrchardCMS v1.3を使用していますが、ClientSideValidationは現在そのコンテキストでは実行できません。さらに、私はいくつかの動的要素を使用しています。私の理解では、そのコンテキストでのClientSideValidationはうまく動作しません(http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-contentを参照してください)。 /);私の最初の制限があれば、そこの回避策は役に立たない。 –

+0

NB:http://stackoverflow.com/questions/6402628/multi-step-registration-process-issues-in-asp-net-mvc-splitted-viewmodels-sing?answertab=votes#tab-topの精巧な解決策その多くの情報を維持するための9つの「ステップ」のための健全な練習ではないというコメントがあります。私の目的のためにも、私は少なくとも7つのステップ(最後のものは確認ですが)に私のフォームを分割しているので、問題になる可能性があります。 –

答えて

5

jQueryの/ JavaScriptは、ウィザードが設定されますすべてのフィールドを含むモデルを作成ウィザード

  • ためのコントローラを作成します

    1. を使用することが許可されていない場合、私はこのような何かをするだろう。
    2. ウィザードごとに1つのアクションページを作成します。すべてのアクションで同じモデルを使用する必要があります。
    3. すべてをDBに保存する最終アクションを作成します。
  • +0

    これは動作しません。なぜなら、アクション内のすべてのデータを使用しないので、コントローラにポストバックするときに、使用しなかったすべてのフィールドが失われるからです。したがって、セッションを使用するか、隠しフィールドを使用する必要があります(ある種のviewstateを作成する)。本当? –

    +0

    が正しい。隠しフィールドを使用する必要があります。 – jgauffin

    +0

    ありがとう、私はdivを追加し、そこにすべての要素を追加しました。それは魅力のように働いた。ありがとう... –

    4

    ジョナスは絶対に正しいです。下のもう少しの内訳。

    public class MyModel 
    { 
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
        public Guid Id { get; set }; 
        public string StepOneData { get; set; } 
        public string StepTwoData { get; set; } 
    } 
    

    上記の略奪は単純なので、そこにあなたのフィールドを置き換えます。次に、ウィザードを開始する簡単なアクションから始めます。

    public ActionResult WizardStep1() 
        { 
         return View(new MyModel()); 
        } 
    

    これは。あなたがしたい場合。私達はちょうど別のアクションにポストをリダイレクトされます作成テンプレートウィザードを使用することができます「WizardStep1.cshtml(あるかみそりを使用している場合)ビューを呼び出します。

    <WizardStep1.cshtml> 
    @using (Html.BeginForm("WizardStep2", "MyWizard")) { 
    

    ノートの事は、我々は別のアクションにこれを掲示されるということです。WizardStep2アクションこのアクションで

    [HttpPost] 
        public ActionResult WizardStep2(MyModel myModel) 
        { 
         return ModelState.IsValid ? View(myModel) : View("WizardStep1", myModel); 
        } 
    

    我々のモデルが有効である場合、我々はチェックし、もしそうなら、私たちは私たちのウィザードに送りますtep2.cshtmlそれ以外の場合は、検証エラーでステップ1に戻します。各ステップで次のステップに送信し、そのステップを検証して移動します。ここで、いくつかの知識豊富な開発者は、ステップ間で[必須]属性やその他のデータ注釈を使用すると、このようなステップ間を移動することはできません。そして、あなたは正しいだろう。だから、まだチェックされていない項目のエラーを取り除く。以下のように。

    [HttpPost] 
        public ActionResult WizardStep3(MyModel myModel) 
        { 
         foreach (var error in ModelState["StepTwoData"].Errors) 
         { 
          ModelState["StepTwoData"].Errors.Remove(error); 
         } 
    

    最後に、モデルをデータストアに一度保存します。これにより、ウィザードを起動しても不完全なデータをデータベースに保存しないようにするユーザーはいなくなります。

    ウィザードを実装するこの方法が、以前に説明した方法よりもはるかに使いやすくメンテナンスされていることを祈っています。

    読んでいただきありがとうございます。

    +0

    ウィザードは単純に次の、次の、次のような状況に対処しますが、前の手順の答えに基づいて次に表示するビューを決定するロジックがあります見る?ありがとう –

    +1

    これは完全なサンプルを求めています。 ;)@SamDelaney、コントローラのif/elseロジックを試してみてください。(ステップ1のラジオボタン1がyesの場合はこれを実行し、そうでない場合はこれを実行してください。 – REMESQ

    関連する問題