1

ドロップダウンを検証する必要があるという要件があります。Button1をクリックすると、モデルはドロップダウンが選択されていないことを検証し、Button2をクリックすると、モデルはドロップダウンが有効な値に選択されていることを検証する必要があります。また、値がからの特定の値である場合、対応するフィールドも必須としてマークされます。落ちる。

私のモデルは以下の通りです:

public class ApprovalInformation
{

    [DisplayName("Approval Decision")]
    public int? ApproveStatusID { get; set; }
    public string ApproveStatus { get; set; }
    public SelectList ApproveStatuses { get; set; }

    [DisplayName("Additional Information")]
    [RequiredIf("ApproveStatus", StringConstants.NotApproved, ErrorMessage = "You must specify the comments if not approved")]
    public string AdditionalInformation { get; set; }
}

現在、2つのアクションメソッドがあり、ボタン名の値に基づいてそれらを呼び出します。コントローラコードは次のとおりです。

public ActionResult SaveApproval(ApprovalInformation approveInfo,string submit)
    {
        if (submit == "Save For Later")
        {
            Business business = new Business();
            int selectedStatusID = approveInfo.ApproveStatusID??0;
            if ( selectedStatusID!= 0)
            {
                ModelState.AddModelError("ApproveStatusID", "You may not set the Approval Decision before saving a service request for later.  Please reset the Approval Decision to blank");
            }
            if (ModelState.IsValid)
            {
              return RedirectToActionPermanent("EditApproval");
            }

            return View("EditApproval", approveInfo);
        }
        else
        {
            TempData["approverInfo"] = approveInfo;
            return RedirectToActionPermanent("FinishApproval");
        }
    }

クリックしたボタンによっては、検証のプラグインに問題があります。別のボタンをクリックすると、同じプロパティが2つの異なる方法で検証される必要があるためです。異なるアクションに応じて、同じモデルで実行時に検証を抑制または検証を誘導するにはどうすればよいですか。これに関するアイデアはありがたいです。

4

1 に答える 1

1

これは、ビューモデルにIValidatableObjectインターフェイスを実装するのに適した状況だと思います。ApprovalInformation必要な再利用を得るために、インテントを辞書に渡すsubmitsave for laterValidationContext辞書に入れることができます。

ここに、「ApprovalStatusが設定されていない場合はAdditionalInformationを設定する必要がある」という条件付きロジックを配置することもできます。

public class ApprovalInformation : IValidatableObject
{
    ... // Properties

    IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
       if (validationContext.ContainsKey("submit"))
       {
          if (ApproveStatusID != 0)
          {
              yield return new ValidationResult("You may not set the Approval Decision before saving a service request for later.  Please reset the Approval Decision to blank", 
                                                 new {"ApproveStatusID"});
          }
       }
    }
}
于 2012-11-23T11:04:14.457 に答える