asp.net MVC 4根据另一个属性的当前值对属性进行动态验证
本文关键字:属性 验证 动态 MVC net 4根 asp 另一个 | 更新日期: 2023-09-27 18:15:53
根据同一模型中另一个属性的当前值动态验证属性的方法存在问题。我已经搜索了很多,无法找到一个答案或类似的例子。
在我的模型中,我有一个邮政编码属性和一个countryID属性。在每个不同国家的数据库中,我有一个不同的正则表达式来验证邮政编码。然后,使用countryID,我可以从数据库中获得相应的正则表达式,以验证相应国家的邮政编码
因此,在我的模型中,根据当前countryID的值,我希望对zip字段进行验证。
我尝试创建一个自定义验证属性"ZipValidation(countryID)",但在模型中它不让我有另一个属性的值作为参数:
public class AddressViewModel
{
...
[Display(Name = "Country ID")]
public Guid? countryID { get; set; }
[Required]
//[ZipValidation(countryID)] does not compile because of the countryID
[Display(Name = "Zip")]
public string zip { get; set; }
}
你知道怎么做吗?
我最终用Jonesy建议的[Remote]
验证属性解决了这个问题,并在我的控制器中使用Json和Ajax。它是这样的:
public class AddressViewChannelModel
{
....
[Display(Name = "CountryID")]
public Guid? countryID { get; set; }
[Required]
[Remote("ValidateZipCode", "Address", AdditionalFields = "countryID")]
[Display(Name = "Zip")]
public string zip { get; set; }
}
public class AddressController : Controller
{
...
public JsonResult ValidateZipCode(string zip, string countryID)
{
ValidationRequest request = new ValidationRequest();
request.CountryID = Guid.Parse(countryID);
request.Zip = zip;
ValidationResponse response = new ValidationResponse();
response = _addressApi.ZipValidation(request);
if(response.IsSuccessful == false)
{
return Json("Not a valid zip code for your chosen country!"), JsonRequestBehavior.AllowGet);
}
else
{
return Json(true, JsonRequestBehavior.AllowGet);
}
}
}
您需要在这里创建自己的验证属性…正如Rodrigo所说,在属性的构造函数中,您将传递验证属性也将使用的属性的Name,在这里是countryID。然后,您将使用反射来获取该属性的值,并知道您可以进行验证。这一切都很好,即使有一点运气和很多技能,你也可以使它可重用,但是如果你想要客户端验证,你需要自己实现它。这是一个很长的故事,我看到你已经从哪里得到了适当的参考来理解整个过程,所以我将给你一个我学到的:灵活的条件验证与ASP。净MVC
这是一种技术含量较低的方法,如果您有时间和意愿,您可能应该研究使用验证属性,但为了完整性,这是一种可行的解决方案。在你的post操作中:
[HttpPost]
public ActionResult MyAwesomePostAction(AddressViewModel model)
{
if (!ValidationUtil.IsValidZipCode(model.zip, model.countryID))
{
ModelState.AddModelError("zip", "Not a valid zip code for your chosen country.");
}
if (ModelState.IsValid)
{
...
}
return View(model);
}
我假设您将在控制器外部存储验证的某个库。这样,在您的操作中就不会有很多多余的代码,如果您需要再次执行此操作,则不必重复验证逻辑。