1

我正在尝试 jQuery 验证片用于apex:commandbuttonVisualforce (Salesforce)。如果它不是 AJAX 调用,它工作正常,我的意思是如果不oncomplete为按钮设置和重新渲染属性。但如果我这样做,它会输入type='button'而不是'submit'. 因此,无论我的验证结果如何(或) ,我在 action 属性中指定的任何方法apex:commandbutton都会被调用。truefalse

为此,我尝试了以下选项,但没有任何结果。

这就是我要的 :

  1. 填写表格字段
  2. 单击命令按钮时,它应该使用 jQuery 进行验证(到目前为止,如果它的类型是提交,它就可以工作,但不幸的是,如果我将它更改为 AJAX 调用,它就会变成type='button'并且不工作)
  3. 调用我的操作方法action="{!SaveUserAndSendEmail}"(如果验证通过创建联系人记录)
  4. Oncomplete="clickCreateUserButton();"(一旦通过操作方法创建联系人记录,这将创建用户记录。

我尝试过的选项:

  • 方法一

一个。在里面添加以下 JQuery 脚本document.ready()

j$('[id$=SaveUserAndSendEmail]').click( 
                    function() 
                    {
                        if (j$('[id$=theForm]').validate().form() == true)
                            {
                                isValid = true;
                                SetContinueProcess(true);
                                //callSaveUserAndSendEmailHidden();
                                //j$('[id$=SaveUserAndSendEmailHidden]').click();                                
                                return true;
                            }
                            else
                            {
                                isValid = false;
                                SetContinueProcess(false);                                
                                return false;
                            }
                    }
); 

湾。如您所见,我调用了一个名为 setContinueProcess 的函数,该函数调用 actionsupport 函数并设置属性 ContinueProcess,如果它为 false,则阻止控制器中 action 方法内的操作。

这不起作用,因为它转到服务器端并清除验证消息。

  • 方法二

一个。与上面提到的相同的 Jquery 方法。唯一的变化是,我没有调用 setContinueProcess,而是尝试使用另一个按钮并使用 display:none 将其隐藏,并尝试使用 jquery 和普通 javascript 从上面的条件中单击它document.getelementbyid("buttonid").click();这调用了 action 方法并创建了联系人记录,但未调用 oncomplete 方法。

  • 方法3

一个。相同的 Jquery 方法,而不是 hiddenbutton,调用了一个 ActionSupport 函数,并在其操作属性和 oncomplete 属性中指定了它的操作方法,就像我为按钮所做的那样。甚至它只调用了action方法,没有调用oncomplete方法

  • 方法四

一个。相同的 jquery 方法,而不是在 actionsupport 中调用 oncomplete 方法,而是从上述 if 条件本身中调用了 action support 方法和 oncomplete 方法:-

SaveandSend(); //Actionsupport method name which calls the controller's action method and creates the contact
CreateUser(); // Javascript method which clicks another button triggering the action method of that to create the user

即使在这个中,第二种方法也没有被调用。

JavaScript 代码:

 function callSimulateUserSave() {
                       var mybtn = document.getElementById('{!$Component.theForm.SimulateUserSave}');
                       mybtn.click();
                   }

视觉力量代码:

<apex:actionFunction name="SetContinueProcess">        
                <apex:param name="ContinueProcess" value="ArgValue" assignTo="{!ContinueProcess}" />
            </apex:actionFunction>
           --commented -- <apex:actionFunction name="SaveandSend"  action="{!SaveUserandSendEmail}" >        
            </apex:actionFunction> -- commented --
<apex:commandButton id="SaveUserAndSendEmail" value="Save and Send Activation Email" action="{!SaveUserandSendEmail}" rerender="junkpanel" oncomplete="if (j$('[id$=theForm]').validate().form() == true){callSimulateUserSave();}">

                            <apex:commandButton value="SimulateUserSave" id="SimulateUserSave" action="{!CreateUserRecord}" style="display:none;margin-left:5px;"/>

                            <apex:commandButton id="SaveUserAndSendEmailHidden" style="display:none;" value="Save and Send Activation Email"  action="{!SaveUserandSendEmail}" rerender="junkpanel" oncomplete="callSimulateUserSave()" >
                            </apex:commandButton>

-- 我可能已经注释掉了一些代码,这些是我尝试过的不同方法/方法的代码,我试图实现解决方案

4

3 回答 3

0

虽然这不是您问题的直接答案,但根据我的经验,我尽量减少对 Visualforce 的使用。它很慢,并且很难调试这样的问题。通常,关于我的 visualforce 页面的唯一 visualforce 是使用 apex:page 标签。

我会使用 HTML 标记而不是 visualforce 标记,并且您的服务器端顶点控制器应该只包含从 javascript 调用的远程操作。存储您的状态客户端并将其注入您的远程调用中。

如果您开始以这种方式构建页面,我认为您会注意到性能明显提高,您将避开一些州长限制,并且您面临的问题会消失,因为您不再使用 visualforce,而是编写javascript,一种更为突出的语言。

于 2012-06-12T23:51:01.733 回答
0

您是否尝试过使用标准 HTML 按钮,触发验证方法 onClick,然后<apex:actionFunction>在验证了所需的所有内容后使用 an 调用后端(即在验证方法结束时,或者如果它返回有效) ? 这是我过去使用的方法,我从来没有遇到过任何问题。

于 2012-06-13T13:04:05.640 回答
0

您应该能够只在 HTML 中拥有一个锚标记或按钮,而不是通过 Visualforce 标记。然后使用 jQuery “on document ready”将点击事件处理程序绑定到按钮/锚标记。从该新函数中,您应该能够调用 jQuery Validation,并且只有在表单有效时才执行操作函数。确保对服务器端控制器代码进行冗余验证。如果发生错误,这里的技巧是在服务器端控制器代码上设置一个变量。然后在动作函数代码中,使用重新渲染属性来定位输出面板。在输出面板内有一些 javascript 将局部变量绑定到控制器中的属性(即... var abc = {!errorHandlingProperty}。然后在重新渲染 javascript 中,只有当控制器中的属性为 true 时,您才能继续执行。这基本上是您的停止机制。我知道这是一长串代码,但它似乎从过去的经验中起作用。

于 2017-02-01T22:50:53.940 回答