我正在尝试验证我的下拉列表项是否已存在于数据库中。它应该将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)
答案 0 :(得分:0)
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)