2017-04-05 2 views
0

私が条件ならば、私はモデル要素は、少なくともいくつかの値が含まれています確認して使用してそうモデルは、それが値

public class person 
{ 
    [Required(ErrorMessage = "Please enter First Name.")] 
    public string first_name {get;set;} 
    [Required(ErrorMessage = "Please enter last Name")] 
    public string last_name {get;set;} 
    [Required(ErrorMessage = "Please enter |DOB")] 
    public DateTime DOB {get;set;} 


} 

POSTメソッド

[HttpPost] 
public ActionResult save_person(person per) 
{ 
if(per.first_name == null || per.first_name =="") 
    per.first_name ="demo_first"; 
if(per.lastname == null || per.lastname =="") 
    per.last_name ="demo_last"; 
if (ModelState.IsValid) //fails even assignment is done above 
{ 


    } 

} 

次のようにMVCでモデルを持っているが含まれた後も無効示しますそれ以降も ModelState.IsValidが失敗し、first_nameとlast_nameが返されます。

このロジックをどのように達成できますか?

+1

'ModelState.IsValid'が上の行にあることを確認するにはどうしたらいいですか? –

+0

あなたのActionResultが呼び出されるまでに 'per'はヌルか空ですか? – Marco

+0

@DarinDimitrov申し訳ありませんが、私の間違いは、デフォルト値を割り当てることができない、モデルにいくつかの他の値があります。これらの値はIsValidを確認する必要があります – Sachu

答えて

3

モデルのfirst_namelast_nameのプロパティが、必須ではない場合は、Required属性で修飾されているのはなぜかはっきりしていません。私はいくつかの参照を追加したい

if (per.first_name == null || per.first_name == "") 
{ 
    per.first_name ="demo_first"; 
    ModelState.Remove("first_name"); 
    ModelState.SetModelValue("first_name", new ValueProviderResult(per.first_name, per.first_name, CultureInfo.InvariantCulture)); 
} 

if (per.last_name == null || per.lastname == "") 
{ 
    per.last_name ="demo_last"; 
    ModelState.Remove("last_name"); 
    ModelState.SetModelValue("last_name", new ValueProviderResult(per.last_name, per.last_name, CultureInfo.InvariantCulture)); 
} 

if (ModelState.IsValid) 
{ 
    ... 
} 
0

を:

これは、あなたのコントローラ内のいくつかのモデルプロパティの値を更新したい場合、あなたはまた、ModelStateでそれを更新していることを確認する必要があるかもしれません、言われています実際のドキュメンテーションで、メソッドのプロパティを変更しても問題を解決できない理由をOPのために解決することができます。

From the docs:

モデル状態のエラー処理

モデルの検証は、前を呼び出されて、各 コントローラのアクションに発生し、ModelState.IsValidを検査するアクションメソッドの 責任です適切に反応する。 多くの場合、適切な反応は、 エラー応答を返すことであり、理想的にはモデル検証 が失敗した理由を詳述します。

つまり、ActionResultが呼び出され、.IsValidプロパティが設定されていると、その検証が既に行われています。あなたのコメントを1として

:同じモデルの別のビューで使用する必要がありますが、異なる検証要件と、適切な注釈と新しいビューモデルを作成するために良いでしょう場合:

public class AnotherPersonViewModel { 
    //no required attribute 
    public string last_name {get; set;} 
    //no required attribute 
    public string first_name {get; set;} 
    //... rest of attributes 
} 

この後、常にビューモデルをエンティティモデルまたは現在行っているものにマップできます。しかし、あなたのアーキテクチャの間違いを救済するために不要なコードをコントローラに混在させることは避けてください。

関連する問題