2012-02-24 13 views
3

私はASP.NET MVCアプリケーションをユーザーフレンドリーにするために、MVCはViewStateを提供していません。私の問題は、ユーザーがサーバーの検証に失敗した場合、すべての値を再度入力する必要はないということです。ユーザーがサーバーの検証に失敗した場合、ASP.NET MVCのフォームに入力した値を保持するにはどうすればよいですか?

ASP.NET MVCでこの問題を解決するにはどうすればよいですか?

+0

+1興味深い質問です。閉鎖しないでください –

+0

SOの質問ポリシーに従って話題を話し合ったり話し合ったりしないようにする方法は、質問の方針に沿って話題以外であるかどうかを質問することではなく、 。 – robertc

+0

私はより多くの炎症性のビットを取り出し、あなたの質問を肉に蒸留しました。ディスカッションが必要な場合は、スタックオーバーフローは望ましくありません。質問を開いたままにするには、編集が必要でした。 –

答えて

0

ウェブアプリケーションで状態を維持しないのはどうですか?

これは複雑な領域です。例えば、状態を管理するためにセッションを使用することの1つの欠点は、それがRWセッションである場合、一度に1つのスレッドだけがそれと対話できることである。これは、同じセッションで複数のスレッドが飛行している場合(たとえば、同じページからの複数のajax呼び出しが並行して実行されている場合など)、問題になります。セッションを有効にすると、これらのスレッドはRWセッションと対話するときにブロックされるため、後続の各スレッドは実行に時間がかかります。

また、複数のノードをファームとして使用する場合は、耐障害性を目的としたWebアプリケーションの場合、共有セッション状態バッキングプロバイダ(SQLサーバーまたは分散キャッシュ)を使用して、ユーザーが同じサーバーになっても、同じ状態に見えることになります。これはパフォーマンスのペナルティをもたらします。

しかし、ユーザーがサーバーの検証に失敗した場合、私は彼らが完全なポストバックを回避し、そのユーザーの確保するために、この問題について再び

すべての値を入力する必要が をたくない正直に言うとページに入力された揮発性のデータは、検証の問題があっても保持されます。これは私の専門分野ではありませんが、Unobtrusive Client Side Validationをご覧ください。 パフォーマンスと使いやすさの理由から、それを実装するのはちょっとした作業ですが、その価値はあります。

ビューステートのメリット/デメリットに関しては、一般的な知恵がこれから離れる理由は、(あなたが気づいていると思いますが)ビューステートは潜在的に不必要に潜在的な落とし穴大きな状態はブラウザとの間で転送され(サーバ側でデシリアライズされる必要があります)、が無効になります。 htmlがクライアントでレンダリングされます。 IMHO MVCに関する最も良い点は、レンダリングされるHTMLのクリーンさです。

スーパーフェイルオーバーを許容する必要のないシンプルなシングルモノリシックWebアプリケーションの場合、セッション管理にASP.NET + Viewstateを使用する際の問題はありません。それはあなたのサイトが何を達成する必要があるかによって異なります。私は他の人が自分の考えを持っていると確信しています。これがあなたにとって便利だと思っています!

5

しかし、ユーザーがサーバーの検証に失敗した場合、私は にすべての値を再度入力する必要はありません。私は実際に理解していません MVCの解決策はこの使用可能性の問題ですか?

実際にパターンはかなりシンプルです。今

@model MyViewModel 

@Html.ValidationSummary(false) 

@using (Html.BeginForm()) 
{ 
    <div> 
     @Html.LabelFor(x => x.Foo) 
     @Html.EditorFor(x => x.Foo) 
    </div> 
    <div> 
     @Html.LabelFor(x => x.Bar) 
     @Html.EditorFor(x => x.Bar) 
    </div> 
    <div> 
     @Html.LabelFor(x => x.Baz) 
     @Html.EditorFor(x => x.Baz) 
    </div> 

    <p><button type="submit">OK</button></p> 
} 

ユーザーが/home/indexに移動するとき、彼は、フォームが表示されます。その後、コントローラ

public class MyViewModel 
{ 
    [Required] 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
    public int Baz { get; set; } 
} 

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      // validation failed => redisplay the view so that 
      // the user can fix his errors 
      return View(model); 
     } 

     // TODO: A this stage the model passed validation => 
     // do some processing here and redirect 

     return RedirectToAction("Success"); 
    } 
} 

、最終的に対応するビューをあなたは、ビューモデルを設計します記入するために、入力フィールドに情報を入力してフォームを送信します。デフォルトのモデルバインダーは、対応するPOSTアクションの要求値からビューモデルを起動してバインドします。検証に失敗すると、モデルステートは無効とマークされ、同じビューを再表示できるようになりました。すべての情報がモデルステートにポストされているので、入力フィールドを生成するために使用されたHTMLヘルパーはポストバックフェーズ中に値を取得して保持することができます。

関連する問題