如何在ASPxGridView的editform模板中验证控件?

时间:2014-12-06 19:36:05

标签: devexpress aspxgridview

我有一个带编辑表单模板的ASPxGridView,里面有一些绑定控件。更新后我想验证,检查服务器端控件中的值。据我所知,这是不可能的。 DevExpress建议订阅RowUpdating事件,但这是完全错误的。没用就像他们所谓的支持一样无用。 问题是,如果控件包含一些无效的文本,并且它在RowUpdating之前很久就会引发异常并且被devexpress吃掉。回到客户端的所有信息都是"输入字符串的格式不正确"。 我想验证服务器端的输入控件。 是的,我也进行行验证,但这仅用于验证业务逻辑。 那么,如何验证服务器端EditForm模板中绑定的控件?

2 个答案:

答案 0 :(得分:1)

你可以澄清一下吗?您希望在更新后之后验证值,或者在将值写入数据库或每个控件之前实际验证值,因为它在您启动更新之前失去焦点?如果有必要进行服务器端验证,那么我建议在DevExpress推荐的RowUpdating和RowInserting服务器端事件处理程序中进行。为什么你认为这是错的?您可以验证每个绑定的控件'网格更新和插入事件的e.NewValues集合中的值。如果任何值未通过验证,则可以取消更新/插入操作。您能否更详细地概述所需的工作流程?

之前的一张海报说黑客是必要的,将一个容器放在编辑表单模板中,这不是真的。您可以通过编辑表单模板中任何控件的.NamingContainer使用编辑表单模板。将验证例程放在特定控件的服务器端_Validation事件处理程序中。 您可以将模板控件评估为一个组:

EditFormValid = ASPxEdit
  .AreEditorsValid(myGrid.FindEditFormTemplateControl("myControl")
  .NamingContainer);

或者您可以在每个控件的验证例程

中更新类变量
public class foo
{
  bool EditFormValid = true;
  .
  .
  .
  void myControl_Validation(object sender, ValidationEventArgs e)
  {
    EditFormValid = EditFormValid && myControl.IsValid;
  }

  void myGrid_RowUpdating(object sender, ASPxDataUpdatingEventArgs e)
  {
    If(EditFormValid)
    {
      .
      .
      .
    }
    else e.Cancel = true;
  }
}

我发现DevExpress非常有效和灵活。然而,灵活性可以是双刃剑,因为有很多方法几乎可以完成你大部分时间所需的一切,但通常只有一种方法可以随时做你需要的一切。开发人员可以轻松地在一个实例中工作,但不一定是正确/最佳实践,并且在他们继续构建项目时,他们已经编码到一个角落。

如果您可以提供更多细节,我也可以。

答案 1 :(得分:0)

据我所知,这是不可能做到的。 Devexpress控件留下了很多希望。无法检查验证是否成功。显然是个大问题。 您可以做的是使用ASPxEdit.AreEditorsValid()再次运行验证。但为此你必须做一点点破解(一如既往使用devexpress)。 在您的编辑表单中放一个容器,一个简单的div,其中包含runat =“server”和ID。这是你的容器。 比使用FindEditFormTemplate()得到他的div并在ASPxEdit.AreDitorsValid()中使用它。 这种解决方法有缺点:

  • 使用不必要的元素使您的aspx代码混乱
  • 服务器端的页面执行速度较慢
  • 浏览器端的页面渲染速度较慢
  • ValidateEditorsIncontainer()再次运行验证,因此有一个很大的问题 性能打击

以上所有都是DevExpress控件的商标。但从光明的一面看它。他们的网格有时需要最多五个无用的服务器和数据库往返才开始编辑。