[Required]
当我将其粘贴到自定义类型属性时,我无法弄清楚如何“自定义”属性的规则。代码如下所示:
public class MyProp
{
public Guid Id {get;set;}
public string Target {get;set;}
}
public class MyType : IValidatableObject
{
public string Name {get;set;}
public MyProp Value {get;set;}
private MyType()
{
this.Name = string.Empty;
this.Value = new MyProp { Id = Guid.Empty, Target = string.Empty };
}
public MyType(Guid id) : this()
{
this.Value.Id = id;
// Fill rest of data through magic
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if(this.Value.Id == Guid.Empty)
yield return new ValidationResult("You must fill the property");
}
}
该模型在表单中(通过其自身EditorTemplate
)显示为带有按钮的文本框,该按钮允许从列表中进行选择(支持数据是 Dynamics CRM 2011 环境,该模型实际上旨在表示查找属性)。
public class MyModel
{
// Many props
[Required] // This one is enforced correctly
public string MyString {get;set;}
[Required] // This one isn't
public MyType MyData {get;set;}
public MyModel() { this.MyData = new MyType(); }
}
结果视图显示了该字段(当然是空的)。用户只能通过单击该字段并从列表中选择来输入数据(一个 jquery 对话框会处理这个问题,并且它已经工作了)。
界面听起来很有希望,IValidatableObject
但代码似乎从未被调用过。
在控制器中,我只是在做
[HttpPost]
public ActionResult MyAction(FormCollection data)
{
if (!ModelState.IsValid) return View();
// magic: handle data
}
我错过了什么?我可能误解了IValidatableObject
接口的用法?