我有一个要求,我需要验证下拉列表。在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种不同的方式验证相同的属性。如何根据不同的操作在同一模型上在运行时抑制验证或诱导验证。任何想法都将受到赞赏。
答案 0 :(得分:1)
我认为在ApprovalInformation
视图模型上实施IValidatableObject Interface是一个很好的情况。您可以将意图传递到submit
字典中的save for later
或ValidationContext
,以便获得所需的重用。
您也可以在此处放置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"});
}
}
}
}