使用 Flex 3 处理客户端和服务器验证?
我是一名应届毕业生,请多多关照。我正在验证用户可以编辑的 Flex DataGrid 单元格中的输入。 DataGrid 中的行由 mx.collections.ArrayCollection
支持,其中包括我编写的 [Bindable]Model
。我想针对 自定义客户端验证器< /a>,当且仅当通过时我想验证服务器上的输入。如果客户端验证失败,我想显示正常的验证错误(见下图)。如果服务器端验证失败,我想使用相同类型的 UI 组件来通知用户。该解决方案不应包含任何外部框架(Cairngorm 或 PureMVC)。
我的 DataGrid 实现是:
<mx:DataGrid id="myPageGrid" dataProvider="{myModelList}" editable="true"
itemEditEnd="verifyInputIsValid(event)">
<mx:columns>
<mx:DataGridColumn dataField="name" headerText="Name"
editable="false" />
<mx:DataGridColumn dataField="fieldNeedingValidation" editable="true"
id="fnv" headerText="Field Needing Validation" />
</mx:columns>
</mx:DataGrid>
当用户编辑单元格时,调用此函数:
private function verifyInputIsValid(event:DataGridEvent):void
{
// Check the reason for the event.
if (event.reason == DataGridEventReason.CANCELLED)
{
return; // Do not update cell.
}
// For the fieldNeedingValidation only
if(event.dataField == "fieldNeedingValidation") {
// Get the new data value from the editor.
var newValue:String = TextInput(event.currentTarget.itemEditorInstance).text;
var validatorResult:ValidationResultEvent = myValidator.validate(newValue);
if(validatorResult.type==ValidationResultEvent.INVALID){
// Prevent the user from removing focus, and leave the cell editor open.
// Also, the edit will not continue and store the blank value
event.preventDefault();
// Write a message to the errorString property.
// This message appears when the user mouses over the editor.
TextInput(myPageGrid.itemEditorInstance).errorString = validatorResult.message;
return;
}
else if(validatorResult.type==ValidationResultEvent.VALID){
// Assuming the data is valid on the Server, this is fine
TextInput(myPageGrid.itemEditorInstance).errorString = "";
TextInput(myPageGrid.itemEditorInstance).text = newValue;
return;
// I'd rather do this
remoteObjectValidationService.validate(newValue);
// Get a String result back from the call to the RemoteObject
// Mark this "edit" (of the cell) as invalid, just as the client-side validator would
}
}
}
当然,为此要工作,在退出 verifyInputIsValid
函数之前,需要调用(并运行)remoteObjectValidationService
的 resultHandler
。以“同步”方式。我知道“Flex中的所有IO都是异步的”,但是必须有一个做这样的事情的标准方法对吗?我已经实现了我的自定义验证器并且工作得很好。
在有效的客户端验证通过后,Flex 程序员如何立即在服务器上进行验证?
我意识到寻找这种“同步”设计似乎很愚蠢,我希望有人有一个答案可以通过最佳实践解决我的问题。在我看来,我想在客户端验证之后立即在服务器上进行验证的原因是我正在使用 Flex 的验证框架。如果我从服务器收到无效响应,我想利用 Flex 必须告诉用户他/她的输入有误的内置 UI 组件。
有什么想法吗?
I'm a new grad, so please be kind. I'm working on validating input in a Flex DataGrid cell that the user can edit. The rows in the DataGrid are backed by an mx.collections.ArrayCollection
that includes a [Bindable]Model
that I wrote. I want to validate against a custom client-side Validator, if-and-only-if that passes I want to validate the input on the server. If client-side validation fails, I want to display the normal validation error (see image below). If server-side validation fails, I want to use the same sort of UI components to notify the user. The solution should not include any external framework (Cairngorm or PureMVC).
My DataGrid implementation is:
<mx:DataGrid id="myPageGrid" dataProvider="{myModelList}" editable="true"
itemEditEnd="verifyInputIsValid(event)">
<mx:columns>
<mx:DataGridColumn dataField="name" headerText="Name"
editable="false" />
<mx:DataGridColumn dataField="fieldNeedingValidation" editable="true"
id="fnv" headerText="Field Needing Validation" />
</mx:columns>
</mx:DataGrid>
When a user edit's a cell, this function is called:
private function verifyInputIsValid(event:DataGridEvent):void
{
// Check the reason for the event.
if (event.reason == DataGridEventReason.CANCELLED)
{
return; // Do not update cell.
}
// For the fieldNeedingValidation only
if(event.dataField == "fieldNeedingValidation") {
// Get the new data value from the editor.
var newValue:String = TextInput(event.currentTarget.itemEditorInstance).text;
var validatorResult:ValidationResultEvent = myValidator.validate(newValue);
if(validatorResult.type==ValidationResultEvent.INVALID){
// Prevent the user from removing focus, and leave the cell editor open.
// Also, the edit will not continue and store the blank value
event.preventDefault();
// Write a message to the errorString property.
// This message appears when the user mouses over the editor.
TextInput(myPageGrid.itemEditorInstance).errorString = validatorResult.message;
return;
}
else if(validatorResult.type==ValidationResultEvent.VALID){
// Assuming the data is valid on the Server, this is fine
TextInput(myPageGrid.itemEditorInstance).errorString = "";
TextInput(myPageGrid.itemEditorInstance).text = newValue;
return;
// I'd rather do this
remoteObjectValidationService.validate(newValue);
// Get a String result back from the call to the RemoteObject
// Mark this "edit" (of the cell) as invalid, just as the client-side validator would
}
}
}
Of course, for this to work, the resultHandler
of the remoteObjectValidationService
would need to be invoked (and run) before we exit the verifyInputIsValid
function. In a "synchronous" fashion. I know “All IO in Flex is asynchronous” , but there must be a standard way to do something like this right? I've already implemented my custom Validator and that works just fine.
How do Flex programmers validate on the server, immediately after the valid client-side validation passes?
I realize it seems silly to search out this "synchronous" design and I hope someone has an answer to solve my problem with best practices. In my defense, the reason I want to validate on the server immediately following client-side validation is so that I'm using Flex's validation framework. If I get an invalid response from the server, I want to leverage the built-in UI components that Flex has to tell the user something is incorrect about his/her input.
Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以创建调用远程服务的自定义验证器。只需让验证器在调用之前运行任何内部检查即可。
我很久以前写过这样的东西。它当然可以做得更好,但你也许可以从中汲取一些想法。
http://www.actionscript.org/forums/showthread.php3?t=173275
更新
这是一个更清晰的示例,展示了类似的内容。
这个想法本质上是运行验证器两次。当初始检查完成时,然后当验证器收到异步操作的适当返回代码时再次检查。如何执行此操作取决于您在应用程序中处理验证事件的方式。
You can create a custom validator that calls a remote service. Just have the validator run any internal checks before making the call.
I wrote something like this a loooong time ago. It could certainly have been done better, but you may be able to pull a few ideas from it.
http://www.actionscript.org/forums/showthread.php3?t=173275
UPDATE
Here is a cleaner example of what something like this might look like.
The idea is to essentially run the validater twice. Once when the initial check is done, then again when the validator as received an appropriate return code for the asynchronous operation. How you do this depends on how you are handling validation events in your app.
执行此操作的“同步”方法是首先进行服务器端验证。创建远程对象并执行服务器端验证:
服务器验证完成后,执行客户端验证:
A "synchronous" way to do this would be to do server-side validation first. Create a remote object and perform server-side validation:
Once server validation is complete, perform the client-side validation:
这篇文章很长,所以我想用解决方案“回答”我的问题,而不是“编辑”显示解决方案的问题是最合适的。我将编辑问题以更准确地反映问题的参数(即要求解决方案不包含任何其他 Flex 框架,例如 Cairngorm 或 PureMVC >,以便保留 简单的)。
我也承认这个解决方案有点弱。目前,我需要弄清楚并删除一个额外的事件 - 但它确实有效并且符合业务/技术要求。这也感觉好像我在“重新发明轮子”,但我宁愿不这样做。因此,如果有人有一个示例(某种设计模式?),其中包括“客户端和服务器验证”,以及对
itemEditor
进行某些更改时使用 Flex 验证框架(我需要的是 DataGrid 单元格编辑),如果您会在这里列出它作为答案,也许我可以给你一些分数!我也不完全确定关闭/提交编辑器的方式。我确实尝试使用
destroyItemEditor()
,但它似乎对我不起作用。这是我的源代码:
MyPage.mxml
UserValidator.as
UserRemoteObjectService.as
这就是当前的代码,@drkstr 和 @Kyle 我很想知道您的想法。
感谢 StackOverflow,@drkstr 今天您获得了“已接受”复选标记,您启发了我的解决方案。
This post is quite long, so I thought "answering" my question with the solution rather than "editing" the question to show the solution was most appropriate. I will be editing the question to reflect the parameters of the problem more accurately (i.e. the requirement that the solution not include any additional Flex framework such as Cairngorm or PureMVC, so as to remain simple).
I also admit that this solution is a bit weak. At the moment, I have one extra event firing which I need to figure out and remove - but it does work and fit the business/technical requirements. This also felt as though I was "re-inventing the wheel" and I'd rather not. So if anyone has an example (some design pattern?) that includes "client and server validation", as well as using the Flex validation framework per some change to an
itemEditor
(my need is a DataGrid cell edit), I would really appreciate it if you would list it here as an answer and maybe I can offer you some points!I'm also not entirely sure about the way that I'm closing / committing the editor. I did attempt to use
destroyItemEditor()
, but it didn't seem to work for me.Here is my source code:
MyPage.mxml
UserValidator.as
UserRemoteObjectService.as
So that's the current code, @drkstr and @Kyle I'm interested to see what you think.
Thanks StackOverflow, @drkstr you're getting the "Accepted" check mark today, you inspired my solution.