2012-03-14 73 views
2

我目前正在研究ASP.NET MVC 3应用程序。我正在建立一个开箱即用的验证屏幕。请允许我使用以下屏幕截图来说明情况。验证ASP.NET MVC子元素

enter image description here

上面你看到TemplateItems的集合。第二列'Uitvoerder'是必需的。这在大多数情况下工作正常。

但问题是,它不是一个常规项目列表,而是它的结构表示层次结构显示在UI中。因此,第二项是第一项的子项,因此包含在您看到的第一个TemplateItem对象中。

对于包含的项目,验证不会触发。

你可能会争辩说,前端模型应该变平并且不太复杂,但是我想避免这种情况。有什么办法可以为子元素提供验证触发器吗?

这个模型看起来是这样的:

public class WorkflowTemplateItemModel 
    : IValidatableObject 
{     
    public WorkflowTemplateItemModel[] ChildWorkflowTemplateItems { get; set; } 

    public long? ExecutionParticipantId { get; set; }  

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    {   
     if (ExecutionParticipantId == null) 
     { 
      yield return new ValidationResult("Contact needs to be specified",new[] {"ExecutionParticipantId"}); 
     } 
    } 
} 

相关剃刀部分:

<td> 
    @Html.DropDownListFor(model => model.ExecutionParticipantId, 
     Model.AvailableUsers.Select(user => new SelectListItem 
     { 
      Text = user.UserName, 
      Value = user.Id.ToString(), 
      Selected = (Model.ExecutionParticipantId == user.Id) 
     }), 
     string.Empty 
    ) 
</td> 

和构建树视图中的剃刀:

@for (int i = 0; i < Model.ChildWorkflowTemplateItems.Length; i++) 
{ 
    @Html.EditorFor(model => model.ChildWorkflowTemplateItems[i], new { Depth = Depth +  1, ParentId = Model.WorkflowItemId, RootModel = GetViewData<CreateWorkflowModel> ("RootModel") }) 
} 
+0

需要查看ViewModel类/类的代码与定义的属性 – reach4thelasers 2012-03-14 14:58:57

回答