使用数据注释使用互斥验证在同一视图中验证模型中的相同属性

时间:2012-11-23 10:53:38

标签: c# asp.net-mvc data-annotations

我有一个要求,我需要验证下拉列表。在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; }
}

目前我有两种操作方法,我根据按钮名称的值调用它们。这是控制器代码:

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种不同的方式验证相同的属性。如何根据不同的操作在同一模型上在运行时抑制验证或诱导验证。任何想法都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

我认为在ApprovalInformation视图模型上实施IValidatableObject Interface是一个很好的情况。您可以将意图传递到submit字典中的save for laterValidationContext,以便获得所需的重用。

您也可以在此处放置conditional logic“如果未设置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"});
          }
       }
    }
}