3

タイトル:ASPMVCでのViewModelフィールドの条件付き検証

ASPMVCの検証について質問があります。次のビューモデルがあるとしましょう

public class PersonViewModel
{
    [Required]
    public string Name {get; set; }

    [Required]
    public string Email {get; set; }
}

これによると、フォームを送信すると、MVCは両方のフィールドに値があることを検証します。ただし、私のWebサイトでは、グローバルサイト設定で電子メールをオフにできる状況があるため、モデルはフォームに名前テキストボックスのみをレンダリングします。フォームを送信すると、「必須」と表示されているため、ユーザーがそのフィールドに入力する方法がないにもかかわらず、メールフィールドの入力を求められます。

ASP MVC検証を使用する場合、このタイプのシナリオの解決策はありますか?

4

4 に答える 4

5

私は解決策を見つけたようです:

if(EmailTurnedOff)
{
    this.ViewData.ModelState.Remove("Email");
}

次に、ModelState.IsValidを呼び出すと、正しい答えが返されます。

于 2013-03-27T10:19:25.710 に答える
4

解決策は、そのような設定が設定されている場合はRequired、フィールドの属性を削除し、投稿時に自分で検証を実行する必要があることです。Emailこのようなもの

[HttpPost]
public ActionResult Post(PersonViewModel model)
{
    //replace EmailTurnedOff with your setting
    if (!EmailTurnedOff && string.IsNullOrWhiteSpace(model.Email))
    {
        ModelState.AddModelError("Email", "Field is Required");
    }

    if (ModelState.IsValid)
    {
        //do whatever
    }

    return View(model);
}
于 2013-03-27T09:31:18.760 に答える
1

条件付き検証は、ViewModelから実行できます。ViewModelクラスは、IValidatableObjectインターフェイスを実装する必要があります。

次に、ViewModelの下部に次のようなメソッドを追加します。

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (validationContext == null)
            return null;

        var valResults = new List<ValidationResult>();

        if (!EmailExists))
            valResults.Add(new ValidationResult($"Email is required.", new[] { "EmailErrorMsg" }));

        return valResults;
    }

ビューの適切な場所にValidationMessageを追加することを忘れないでください。

@Html.ValidationMessage("EmailErrorMsg")

ハッピーコーディング!

于 2019-04-12T19:23:31.053 に答える
0

グルーヴジェットから 便乗して、これがビューモデルの代わりにコントローラーで条件付き[必須]を使用した方法です。これを行ったのは、アプリケーションで[必須]を無視したいアクションが1つしかないためです。

    public ActionResult Update(MyViewModel mVM)
    {
        if(mVM.Role == "Role" && mVM.Property == null)
        {
            ModelState.Remove("Property");
        }
        if (ModelState.IsValid)
        {
           // code...
        }
     }
于 2016-07-29T18:40:06.400 に答える