【问题标题】:Validation ASP.NET MVC Child Elements验证 ASP.NET MVC 子元素
【发布时间】: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 类/类的代码

标签: asp.net-mvc validation


【解决方案1】:

您可以这样做,但您需要创建一个自定义验证,包括客户端验证代码。

流程和这个类似:http://haacked.com/archive/2009/11/18/aspnetmvc2-custom-validation.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2011-11-12
    相关资源
    最近更新 更多