2016-11-10 8 views
0

私のコントローラには以下のアクションメソッドがあります。しかし、Model.IsValid()は、検証条件が正常であっても成功メッセージを表示しなくても常にfalseを返すようです。どんな助けもありがとう。ASP.NET MVCモデルの検証は常に失敗します

[Required(ErrorMessage ="Please Enter Your Name!")] 
    [MaxLength(24)] 
    [MinLength(8)] 
    [RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "Kindly use letters only for name")] 
    public string EmployeeName { get; set; } 

    public string Designation { get; set; } 

    [Required] 
    [MaxLength(7)] 
    [MinLength(4)] 
    [RegularExpression("[^0-9]*$", ErrorMessage = "Salary must be numeric")] 
    public decimal Salary { get; set; } 

    [Required(ErrorMessage = "Please Enter Your Date Of Birth!")] 
    [DataType(DataType.DateTime)] 
    public DateTime DateOfBirth { get; set; } 

    [DataType(DataType.DateTime)] 
    public DateTime DateCreated { get; set; } 
+0

ビューモデルのプロパティを検証して、実際に有効であることを確認しましたか? – JB06

+3

'@Html.ActionLink'を使用してページを' EmployeeForm'に直接リダイレクトする必要があります(サーバーリソースを節約します) –

+0

どのような検証エラーですかあなたが受け取ったメッセージ? –

答えて

0

は、あなたはこれを試したことがありますか? ModelState.IsValidは、適切なものを入力したことだけを確認しているので、途中で取り除いてから、切り替えたボタンを押して決定します。

[ActionName("CreateNewEmployeeForm")] 
[HttpPost] 
public ActionResult SaveEmployee(EmployeeViewModel employee, string btnSubmit) 
{ 
    if (ModelState.IsValid) 
    { 
     switch (btnSubmit) 
     { 
      case "Save Employee": 
       ViewBag.Message = "Thanks! We got your information."; 
      ... where you want to send them after they submit their data 
       break; 
      case "Cancel": 
      ... where you want to send them if they cancel (maybe back to the beginning) 
       break; 
     } 
    } 
    return View(); 
} 

このように、スイッチのロジックが邪魔になることはありません。 if文に改行を入れて従業員モデルを確認します。

また、btnSubmit == Cancelの場合は早期にif状態を指定し、その時点でModelState.IsValidまたはスイッチを処理せずにリダイレクトすることもできます。

+0

はい、ブレークポイントを置くことでフローがif節に当たらず、常にelseブロックを実行してフォームに戻ることがわかりました – izengod

+0

HttpGet ActionResultにbtnSubmitがありますか?どのようにそれを渡していますか?通常、ユーザーはhttpgetを使用してフォームに記入して送信し、HttpPostは送信されたデータを処理します。ユーザーがキャンセルすると、フォームに必要な値が不足している可能性があります。そのbtnSubmit変数を削除すると、フォームが正しく処理されますか? – nocturns2

+0

必要に応じてhttppostをチェックしてユーザーをルーティングすることができる非表示フィールドをビューモデルにいつでも配置することができます。 – nocturns2

0

は、エラーメッセージが何であるかを確認するためにあなたにModelStateを点検し、言及する他の事は、それが1つのアクションを書くためのクリーンな方法ではありません。

[ActionName("CreateNewEmployeeForm")] 
    [HttpPost] 
    public ActionResult SaveEmployee(EmployeeViewModel employee, string btnSubmit) 
    { 
     switch (btnSubmit) 
     { 
      case "Save Employee": 
       if (ModelState.IsValid) 
       { 
        ViewBag.Message = "Thanks! We got your information."; 
        return View(); 
       } 
       else 
       { 
        return View(); 
       } 
       break; 
      case "Cancel": 
       return RedirectToAction("EmployeeForm"); 
     } 
     return new EmptyResult(); 
    } 

後、私はエンティティに使用しているの検証がされていますメソッドは2つの異なる操作を行う2つのボタンを提供するためには、2つのアクションを作成する必要があります。

1

あなたは、エラーの原因となる検証してみてください:

foreach (ModelState state in employee.ModelState.Values.Where(x => x.Errors.Count > 0)) 
{ 

} 
0

あなたの正規表現が正しくないようですが、帽子(^)は括弧の外にあるはずですか?

[RegularExpression("[^0-9]*$", ErrorMessage = "Salary must be numeric")] 

このヘルプが必要です。 :)

関連する問題