2017-04-15 7 views
1

基本的に私が理解しようとしているのは、少なくとも2つのフィールドのうちの少なくとも1つをビューに入力する必要がある方法です。1つのフィールドまたは別のフィールドを必要とする

私のビューには、ISBNとISBN13という2つのテキストフィールドがあります。

ここで何をするべきかわからないので、カスタムバリデーターを書くことを期待して、最初に尋ねると思いました。私はいくつかのコードを含んでいただろうが、それはちょうど2つの単純なフィールドなので、私はこの説明がより良いと思った。

+2

あなたが望むものを得るためにこれに投稿された答えに小さな変更を加えることができますhttp://stackoverflow.com/questions/11959431/how-to-create-a-custom-validation-attribute?rq=1 – Shyju

+0

カスタムコードはここでは絶対に適切です。実際にはカスタムバリデーターは必要ありません。これは、UIの関心だけでなく、コアドメインのビジネスロジックです。エンティティを無効な状態で作成することは不可能です(例えば、これを検証するためにthrowing-codeを組み立てることができます)。UIの別のjavascript検証は、ユーザに即時のフィードバックを与えるのに役立ちます –

答えて

1

私はこれをあなたのコントローラに、データベースに変更を保存する直前の作成セクションに追加すると思います。これが何をするか

int countISBN = Product.ISBN.Count() + Product.ISBN13.Count(); 
if (countISBN <= 9) 
{ 
    // Add in an error message. 
    return View(); 
} 

は、二つのフィールド内の文字をカウントし、それらを合計するです。合計が10を下回ると、エラーが発生します。

1

使用MVC Foolproof NuGetパッケージと、あなたは、以下のようなRequiredIf属性を使用することができます。

[RequiredIf("ISBN==\"\"")] // backslash is used for escaping the quotes 
public string ISBN13 { get; set; } 

[RequiredIf("ISBN13==\"\"")] 
public string ISBN { get; set; } 
2

あなたのコントローラのアクションで、マニュアルの検証を行うことができます。 AddModelErrorメソッドは、検証スタックの使用に役立ちます。

[HttpPost] 
public ActionResult Edit(EditModel model) 
{ 
    if (string.IsNullOrEmpty(model.ISBN) && string.IsNullOrEmpty(model.ISBN13)) 
    { 
     var validationMessage = "Please provide ISBN or ISBN13."; 
     this.ModelState.AddModelError("ISBN", validationMessage); 
     this.ModelState.AddModelError("ISBN13", validationMessage); 
    } 

    if (!string.IsNullOrEmpty(model.ISBN) && !string.IsNullOrEmpty(model.ISBN13)) 
    { 
     var validationMessage = "Please provide either the ISBN or the ISBN13."; 
     this.ModelState.AddModelError("ISBN", validationMessage); 
     this.ModelState.AddModelError("ISBN13", validationMessage); 
    } 

    if (this.ModelState.IsValid) 
    { 
     // do something with the model 
    } 

    return this.View(model); 
} 

クエリの検証を行うのはコントローラーの責任ではないと言う人もいます。私は、コントローラの責任はWeb要求をドメイン要求に適応させることだと思います。したがって、コントローラは検証ロジックを持つことができます。ドメイン/ビジネス層がない場合、この考え方には意味がありません。

関連する問題