2012-03-07 16 views
0

私のアプリケーションには検証フォームがあります。そのフォームには2つのボタンがあります。受け入れるものと拒絶するもの。ユーザが拒絶を押すと、拒絶の理由フィールドが提供されなければならない。私はこのサーバサイドをチェックする。 私は最初にどのボタンが押されているかを確認し、フィールドが空であればモデルステートにmoddelエラーを追加します。しかし、フォームのすべてのフィールドは読み込み専用なので、それらはサーバーにポストされません。そのため、ビューがユーザーnに返されたときにはデータはありません。私はおそらく明らかに何かが不足しているでしょうが、何をすべきかを見つけることはできません。 (私は私のフォームのすべてのフィールドを非表示にすることができますが、大量のフィールドのため、これは本当に醜いでしょう)asp.net mvc Serverside検証戻り値なし

これは私のコードです。

[HttpPost] 
    public virtual ActionResult Validate(string action, Record dto) { 

     if(action == Global.Accept) { 
      ciService.Store(dto); 
      return RedirectToAction("Index", "Ci"); 
     } else { 
      if(string.IsNullOrEmpty(dto.RejectionReason)) { 
       ModelState.AddModelError("RejectionReason", "REQUIRED!!!!"); 
       return View("Validate", dto); 


      } 
      ciService.Reject(dto); 
      return RedirectToAction("Index", "Ci"); 
     } 
    } 
+0

私は受け入れと拒否の2つのアクションメソッドを作ることを提案できますか? Validateという名前のアクションは、ciService.Store(dto)を実行するのに適切な場所ではありません。 – labroo

+0

'readonly'フィールドはどういう意味ですか?あなたの入力タグに使用できる 'readonly'と' disabled'属性がありますか?それはあなたが話していることですか?両方の属性はユーザーがこれらのフィールドの値を変更できないようにしていますが、 'readonly'入力フィールドは' disabled'フィールドではない値をサーバーにPOSTします。 –

+0

@DarinDimitrov私は、彼はモデルクラスのフィールドは読み取り専用であると思います。デフォルトのMVCテンプレートはHTMLフォームフィールドではなく、テキストとして表示されます。 –

答えて

2

あなたは、データベースからモデルを再作成してからdtoに掲載されているものは何でも変更一致するように変更する必要があります。次に、その結​​合されたモデルをビューで使用します。

+0

これはユーザーがこのフォームに記入できるフィールドは1つだけなので、これは私が行ったものです。ありがとう – Patrick

0

UIに表示される各プロパティに対応する非表示フィールドが必要です。例えば

@ Html.LabelFor(M => m.MyProperty) - ディスプレイのため

@ Html.Hiddenfor(M => m.MyProperty) - サーバへToPostback値

0

私が正しく理解していれば、問題はあなたが入力を使用しないためです。あなたがそうしないと、バックあなたの行動

0

に渡されていない値を修正する必要があり、コントローラ

@Html.HiddenFor(model => model.Myfield1) 
@Html.HiddenFor(model => model.Myfield2) 

に渡す必要値を使用して、フォームに隠されたいくつかの入力を挿入し、あなたの問題を解決するために サーバー側でこれらのフィールドが必要な場合は、単純に新しいViewModel RecordValidateViewModelを作成します。これには、検証が必要なフィールドのみが含まれています。モデルのバインダーが作成され、そのモデルのフィールドだけではなく、他のすべてのフィールドの検証が行われます。

検証する必要がある場合は、サーバーに戻して投稿してください。それは隠されていても「醜い」ではありません。

1

ブラウザからDTOを戻すのではなく、隠しHTMLフィールドまたはDTOを識別するIDを含むクエリ文字列パラメータを使用します。あなたは内の必要なすべてのデータを持っている。このように

[HttpPost] 
public virtual ActionResult Validate(string action, int id) 
{ 
    // reload the DTO using the id 
    // now you have all the data, so just process as you did in your question 

    if (action == Global.Accept) { ... } 
    ... 
} 

次のようになりますあなたのGETメソッド...

[HttpGet] 
public virtual ActionResult Validate(int id) 
{ 
    // load the DTO and return it to the view 

    return View(); 
} 

:次に、あなたのPOSTアクションメソッドは次のようになりあなたが必要とすることを行うためのあなたのPOSTアクションメソッド。