在我开始之前...我无法轻松地将项目迁移到 MVC3。所以。
我遇到的问题是我定义了一个自定义验证器属性来检查字符串属性的最大和最小长度,StringLengthInRangeAttribute。
当 Controller 调用 ModelState.IsValid 时,在 Passengers 列表中,只有 Date 属性的验证抛出无效,而没有提供任何内容。我想这意味着我的问题不在于自定义验证器,而在于所有验证?
更新(为清楚起见的附加信息):
这个问题我有两个症状:
1.字符串 上的 Required 验证器在空
时不会触发和
2.我的自定义验证器永远不会被调用(我设置的断点永远不会被击中)。
型号:
public class Passenger
{
[Required(ErrorMessageResourceType = typeof(Resources.Messages.Passenger),
ErrorMessageResourceName = "RequireNumber")]
public int Number { get; set; }
[Required(ErrorMessageResourceType = typeof(Resources.Messages.Passenger),
ErrorMessageResourceName = "RequireSurname")]
[StringLengthInRange(MinLength = 2, MaxLength = 30, ErrorMessageResourceType = typeof(Resources.Messages.Passenger),
ErrorMessageResourceName = "MaxLengthSurname")]
public string Surname { get; set; }
}
自定义验证器:
public class StringLengthInRangeAttribute:ValidationAttribute
{
public int MinLength { get; set; }
public int MaxLength { get; set; }
public override bool IsValid(object value)
{
if (((string)value).Length < MinLength)
{
return false;
}
if (((string)value).Length > MaxLength)
{
return false;
}
return true;
}
}
Controller Action :
public ViewResult TailorHoliday(List<SearchAndBook.Models.ViewModels.Passenger> passengers,
int leadPassengerIndex)
{
if(!ModelState.IsValid)
{
return View("PassengerDetails", GetBookingState(_currentSession));
}
//...
return View();
}
任何建议表示赞赏。这是我第一次使用数据注释,所以我已经准备好因遗漏某些东西而感到愚蠢!
如果您检查 ModelState 属性的内容(在调试器中),您应该能够看到在 ModelState.Keys
中得到验证的每个属性,并且对于每个值,您都可以在ModelState.Values
。如果我看一下您的 Controller ,您似乎发布了完整的乘客名单。您还应该检查您的值是否真的已发布(使用 Firebug 或 Fiddler)。也许您的字段在表单之外。
也许您还应该显示部分 View 以发现错误。
我是一名优秀的程序员,十分优秀!