MVC 3自定义验证器不会被调用

时间:2011-09-14 09:49:12

标签: asp.net-mvc

我正在尝试验证我的下拉列表项是否已存在于数据库中。它应该将Model.IsValid设置为false,但它始终为true,看起来像验证器只是没有被调用

DropDownList代码:

</td>
            </tr>
            <tr>
           <td>   @Html.Label("VendorId ")  </td>
           <td>  @Html.DropDownListFor(x => x.id, new SelectList(Model.validatingVendors, "VendorKey", "VerndorID", Model.id)) @Html.ValidationMessageFor(x=>x.validatingVendors.FirstOrDefault(s=>s.VendorKey == x.id).VerndorID)</td>
            </tr> 

我的自定义Validator类

public class VendorAttribute : ValidationAttribute
{
    DataManager manager = new DataManager();

    public override bool IsValid(object value)
    {
        var stringValue = Convert.ToString(value, CultureInfo.CurrentCulture);
        if (value == null)
        {
            return true;
        }

        if ((value is string) && string.IsNullOrEmpty((string)value))
        {
            return true;
        }

        var name = value.ToString().ToLower();

        // fake a database lookup and bring back two widgets

        return (manager.VendorAllreadyExcists(stringValue));
    }

    public override string FormatErrorMessage(string name)
    {
        return name;
    }

}

我的模型类

public class VelidationVendorViewModel
{
    public int VendorKey { get; set; }

    [Required]
    [Vendor(ErrorMessage = "Vendor Allerede eksister")]
    public string VerndorID { get; set; }

    public int LatestSalesCWeek { get; set; }
    public bool Active { get; set; }

}

我的parentViewModel

public class ParentViewModel
{

    public List<FactRefIdFileFormatIdViewModel> model { get; set; }
    public RefrenceDataViewModel refModel { get; set; }
    public List<MetaFileFormatsViewModel> metaModel { get; set; }
    public int id { get; set; }
    public VelidationVendorViewModel vendorId { get; set; }
    public IEnumerable<VelidationVendorViewModel> validatingVendors { get; set; }
}

刚刚解决了

 [Required]
    [Vendor(ErrorMessage = "Vendor Allerede eksister")]
    public string VerndorID { get; set; }
我的viewmodel上的

是错的,因为我必须将我的自定义验证移动到我的ParentViewModel中的id,所以它看起来像这样:

public List<FactRefIdFileFormatIdViewModel> model { get; set; }
    public RefrenceDataViewModel refModel { get; set; }
    public List<MetaFileFormatsViewModel> metaModel { get; set; }
     [Required]
        [Vendor(ErrorMessage = "Vendor Allerede eksister")]
    public int id { get; set; }
    public VelidationVendorViewModel vendorId { get; set; }
    public IEnumerable<VelidationVendorViewModel> validatingVendors { get; set; }

最后但并非最不重要的是,我的验证必须在列表中调用ID而不是vendorId,如下所示:

 @Html.ValidationMessageFor(x=>x.Id)

2 个答案:

答案 0 :(得分:0)

  1. 您是否尝试过调试并亲自查看验证者是否被调用?
  2. 从你的方法名称来看,你似乎在使用wring逻辑:
  3. return (manager.VendorAllreadyExcists(stringValue));

    如果DO EXISTS返回TRUE,那是你想要的吗?如果它不存在,你不想返回TRUE吗? (假设事实上,对于名称为“无效”的情况,您返回TRUE - 不能对DB进行测试)

答案 1 :(得分:0)

刚刚解决了

 [Required]
    [Vendor(ErrorMessage = "Vendor Allerede eksister")]
    public string VerndorID { get; set; }
我的viewmodel上的

是错的,因为我必须将我的自定义验证移动到我的ParentViewModel中的id,所以它看起来像这样:

public List<FactRefIdFileFormatIdViewModel> model { get; set; }
    public RefrenceDataViewModel refModel { get; set; }
    public List<MetaFileFormatsViewModel> metaModel { get; set; }
     [Required]
        [Vendor(ErrorMessage = "Vendor Allerede eksister")]
    public int id { get; set; }
    public VelidationVendorViewModel vendorId { get; set; }
    public IEnumerable<VelidationVendorViewModel> validatingVendors { get; set; }

最后但并非最不重要的是,我的验证必须在列表中调用ID而不是vendorId,如下所示:

@ Html.ValidationMessageFor(X =&GT; x.Id)