0

[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接口的用法?

4

1 回答 1

1

您的控制器操作应该将视图模型作为参数,而不是FormCollection与您的模型(及其验证规则)绝对无关的弱类型:

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    if (!ModelState.IsValid) 
    {
        return View();
    }

    // magic: handle model
}

现在将调用默认模型绑定器,以便从请求中绑定视图模型并评估您可能在此模型中具有的任何验证逻辑。

您如何期望您的代码 ASP.NET MVC 知道您正在使用此类MyModel?您绝对从未在 POST 操作中使用过它,因此您不能期望对其进行任何验证。

一旦你开始使用视图模型,你就应该忘记弱类型集合,例如FormCollection并开始使用这些视图模型。

于 2013-10-14T10:19:59.283 回答