【发布时间】:2012-07-15 06:17:15
【问题描述】:
我目前正在开发一个 ASP.NET MVC 3 应用程序。我正在构建一个带有开箱即用验证的屏幕。请允许我使用以下屏幕截图来澄清情况。
在您的上方可以看到 TemplateItem 的集合。第二列“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"});
}
}
}
相关的 Razor 部分:
<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") })
}
【问题讨论】:
-
需要查看定义了属性的 ViewModel 类/类的代码