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; }
}

你知道怎么做吗?

asp.net MVC 4根据另一个属性的当前值对属性进行动态验证

我最终用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);
}

我假设您将在控制器外部存储验证的某个库。这样,在您的操作中就不会有很多多余的代码,如果您需要再次执行此操作,则不必重复验证逻辑。