2011-08-09 5 views
1

通常のビュー(レイアウトの@RenderBody())で表示される検証(サーバー側とクライアント側)のログインパーシャルビュー(ユーザー名、パスワード、送信ボタン)とモデル(一部のコントロールと送信ボタン)メインビューでのサーバー側の検証も部分ビューでの検証の原因になります

私の問題は、いずれかの私のビューでサーバ側の検証が行われたときに、ログインのhttppost機能が実行されるためログイン部分ビューも検証されることです。どうすればそれを止めることができますか?

ログイン・ビュー・コントローラ

[HttpGet] 
    public ActionResult LogOn() 
    { 
     return PartialView(); 
    } 

    // 
    // POST: /Account/LogOn 

    [HttpPut] 
    public ActionResult LogOn(LogOnModel model) 
    {    
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
       ViewBag.UserName = model.UserName; 
      } 
      else 
      { 
       ModelState.AddModelError("", Resources.Account.Account.LoginFailureText); 
      } 
     } 

     return PartialView(model); 
    } 

とモデルコントローラ

public ActionResult MyModel() 
    { 
     ViewBag.DisplayThxMsg = false; 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult MyModel(Models.FeedbacksModel feedback) 
    { 
     if (ModelState.IsValid) 
     { 
      //do something 
     } 
     else{ 
      //do another thing 
     } 
     return View(feedback); 
    } 

答えて

1

私は理解し、あなたの質問は非常に難しいです。あなたの問題を推測すると、サイトレイアウトの一部として表示されるログイン部分コントロールがあり、すべてのページに表示されています。したがって、ページを送信している間は、ユーザー名のパスワードの検証が始まり、そのことを防ぐ必要があります。

モデルバインド中にすべての検証@サーバー側が発生することを理解してください。プロパティは投稿されたフィールドにバインドされているので、フィールドの属性は参照され、受け入れられます。したがって、サーバー側の検証を防ぐためには、ログイン部分ビューをに入れてください。それは自分のフォームです。ページ上の他のフォームを送信している間は送信されません。

要するに、ログイン用のフォームとフィードバック用のフォームが2つあります。すべての入力フィールドを同じフォームに入れないでください。

それでも検証エラーが発生した場合は、型変換の問題のような理由が原因です。デフォルトのモデルバインダーは、基本型変換の問題にいくつかのエラーを追加します(例えば、 "int"の何かに非数値を渡すなど)。DataAnnotationsモデルバインダーのサンプルは、DataAnnotations属性から取得した検証エラーあなたのモデル。

EDIT

あなたは行番号125

@using (Html.BeginForm()){Html.RenderAction("LogOn", "Account");} 

を見ればあなたはログインフォームがレンダリングされます上記のコードを持っています。 それはライン45

<form id="form1" runat="server" method="post"> 

で他の形の内側にそうだろうこれは、</html>

あなたは

<form id="form1" runat="server" method="post"> 
@using (Html.BeginForm()){Html.RenderAction("LogOn", "Account");} 
</form 

から構造を変更する必要がありますまで、それは文書全体を網羅しますので、何の終了タグがありません〜

<form id="form1" runat="server" method="post"> 
</form> 
@using (Html.BeginForm()){Html.RenderAction("LogOn", "Account");} 

Th @(Html.BeginForm()){Html.RenderAction("LogOn", "Account");}という行は、このフォーム<form id="LoginView1" action="LogOn">とそれのすべての子要素をレンダリングします。

レイアウト・ページの使用の最新EDIT

この: @Html.Partial("~/Views/Shared/LogOnPartial.cshtml", new LogOnModel()) の代わりに、この: @Html.Action("LogOnPartial", "Account")

ので、すべての作品は、[HttpPost]でマークされたLogOnPartialメソッドが呼ばれている理由に要求はPOSTコンテキスト内にありました。あなたが望むのは、あなたは、POSTing中でさえアクション実行せずにビューを必要とするだけです。上記のコードはそれを行います。アクションメソッドを呼び出さずにビューをレンダリングします。 MVC3は、愚かなserventのようなものです。要求がポストコンテキストにある場合、[HttpPost]とマークされたActionメソッドを呼び出す必要があることだけがわかります。リクエストが別のアクション(索引)のポスト・コンテキストであり、このアクションではない(ログオン・パーシャル)ことはわかりません。今すぐこのメソッドを削除することができます

public ActionResult LogOnPartial() 
     { 
      return PartialView(); 
     } 

これはもう使用されません。

ログインに成功すると、の代わりに return RedirectToAction("Index","Home");を返すように、アカウントコントローラのLogOnPartialメソッドを変更する必要があることに注意してください。 FAILUREでは、コーディングしたときにパーシャルビューをレンダリングできません。まったく新しいビューを返す必要があります。それはインデックスでもLogonPartailsでもなければならない - ちょうどそれ自身のレイアウトを持っているreturn View("Login_Error_View");を返す。そうしないと、ワークフローを制御することが困難になります。

+0

ログインは既にフォームに表示されていますが、問題は表示され、DataAnnotationsモデルバインダは必須フィールドエラーを返します。魔法使いの送信ボタンをクリックするように指示する方法はありますか? –

+0

レンダリングされたHTMLをチェックして、2つの別々のネストされていないフォームタグが作成されていることを確認しましたか? 1つのフォームはログイン用であり、別のフォームはフィードバック用です。重複したり、ネストされてはいけません。これがそうであれば教えてください。 – Zasz

+0

関連するすべてのビューをhttp://pastebin.com/に貼り付けるか、どこかで見ることができます。人々はしばしばレイアウトファイルにフォームを入れ、部分的なビューにもう1つのフォームを入れます。そのような入れ子がおそらくエラーを引き起こしています – Zasz

関連する問題