【问题标题】:How to validate controls inside editform template of ASPxGridView?如何验证 ASPxGridView 的编辑表单模板中的控件?
【发布时间】:2014-12-06 19:36:05
【问题描述】:
我有一个带有编辑表单模板和一些绑定控件的 ASPxGridView。更新后我想验证,检查服务器端控件中的值。据我所知,这是不可能的。 DevExpress 建议订阅 RowUpdating 事件,但这是完全错误的。就像他们所谓的支持一样无用。
问题是,如果控件包含一些无效的文本,并且它在 RowUpdating 之前很久就引发了异常,并且它被 devexpress 吃掉了。它返回给客户端的只是一些消息,例如“输入字符串的格式不正确”。
我想验证服务器端的输入控件。
是的,我也进行行验证,但这仅对验证业务逻辑有用。
那么,如何验证绑定在服务器端EditForm模板内的控件呢?
【问题讨论】:
标签:
devexpress
aspxgridview
【解决方案1】:
你能澄清一下吗?您想在更新之后或实际上在将值写入数据库或每个控件之前验证值,因为它在您可以启动更新之前失去焦点?如果有必要进行服务器端验证,那么我建议按照 DevExpress 的建议在 RowUpdating 和 RowInserting 服务器端事件处理程序中进行。为什么你认为这是错误的?您可以在网格的更新和插入事件的 e.NewValues 集合中验证每个绑定控件的值。如果任何值未通过验证,您可以取消更新/插入操作。您能否更详细地概述您想要的工作流程?
之前的一位发帖人说有必要进行 hack,在编辑表单模板中放置一个容器,这是不正确的。您可以通过编辑表单模板中任何控件的 .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 非常有效和灵活。然而,灵活性可能是一把双刃剑,因为有很多方法几乎可以完成您大部分时间需要的所有事情,但通常一种方法可以始终完成您需要的所有事情。开发人员可以轻松地在一个实例的基础上构建,但不一定是正确的/最佳实践,并且在他们继续构建项目时,他们已经编码到了一个角落。
如果你能提供更多细节,我也可以。
【解决方案2】:
据我所知,这是不可能的。 Devexpress 控件有很多值得期待的地方。无法检查验证是否成功。显然是个大问题。
您可以做的是使用 ASPxEdit.AreEditorsValid() 再次运行验证。但是为此,您必须做一些小技巧(与 devexpress 一样)。
在您的编辑表单中放置一个容器,一个带有 runat="server" 和 ID 的简单 div 就可以了。这是你的容器。
比使用 FindEditFormTemplate() 获取他的 div 并在 ASPxEdit.AreDitorsValid() 中使用它。
这种解决方法有缺点:
- 用不必要的元素使您的 aspx 代码混乱
- 服务器端的页面执行速度较慢
- 浏览器端的页面渲染速度较慢
- ValidateEditorsIncontainer() 再次运行验证,所以有一个大
性能受到影响
以上所有内容均为 DevExpress 控件的商标。但从光明的一面来看。他们的网格有时需要多达五次不必要的服务器和数据库往返才能开始编辑。