【问题标题】:jQuery validation for visualforce for apex:commandbutton input type='button' ajax call顶点的visualforce的jQuery验证:命令按钮输入类型='按钮'ajax调用
【发布时间】:2012-06-12 11:55:45
【问题描述】:

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

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

这就是我想要的:

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

我尝试过的选项:

  • 方法一

a.document.ready() 中添加以下 JQuery 脚本:

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;
                            }
                    }
); 

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

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

  • 方法二

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

  • 方法三

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

  • 方法四

a. 相同的 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();
                   }

Visualforce 代码:

<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>

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

【问题讨论】:

    标签: jquery ajax validation salesforce visualforce


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢大家的回复.. 很抱歉没有早点回复。我已经解决了我的问题并能够执行 jquery 验证.. 将在我的博客中发布代码并分享链接
      • 您是否有机会将链接发布到您的博客文章(知道这是旧的)?
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-24
        • 2011-08-28
        • 1970-01-01
        • 2013-12-01
        • 1970-01-01
        • 2014-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多