正如我的Apex代码如下所示,
当用户使用'apex:commandButton'执行'saveSearchItems'操作时, 如果验证结果为“假”, 我想向用户消息显示确认对话框,其中“验证失败,您要继续吗?”。
当用户按“确定”按钮时,我想保存项目(通过执行saveSearchItems方法),如果用户按“否”,我想停止保存(什么都不做)。
任何人都可以告诉我如何通过Apex& amp; Visualforce。 非常感谢。
/**
* Save list of SearchItems
*/
public void saveSearchItems() {
// Validate values of SearchItems
Boolean validateResult = validateSearchItems(this.searchItemList);
// Save SearchItems
saveSearchItems(this.searchItemList);
}
答案 0 :(得分:1)
Apex代码在服务器上执行,而不是在客户端执行,因此Apex不会显示对话框。因此,您必须将验证移至客户端(使用javascript onclick处理程序),否则您必须将保存过程分为两个Ajax调用服务器,一个用于验证另一个要保存,然后使用中间验证结果可选地显示对话框。选择取决于验证的复杂性(validateSearchItems
)
答案 1 :(得分:1)
虽然mmix是正确的,但实际上有一种方法可以模拟这个,它只需要一点点创造性地使用apex:actionFunction和一些javascript。您基本上将操作分解为两个来处理http客户端/服务器模型的现实。
首先是验证调用以确定是否应该向用户显示弹出窗口,其次是根据用户响应调用以进行保存。请记住,我的解决方案取决于javascript确认框,所以这里没有花哨的ui:)
仅供参考 - 在我的示例中我确实引用了jquery,只是将jquery最小化库保存为jquery.txt并添加到名为' jquery'的静态资源中。你很高兴。
使用以下代码创建一个控制器类:
public class ActionFunctionCLS {
public Boolean causeValidationWarning {get; set;} // Just used for controlling the test behavoir from the ui. Not a part of the solution.
public String validationWarning {get; set;}
// Validates the record (or whatever) is good. If it is then we call save, else we set a warning message that
// tells the ui to display a javascript popup box to the user confirming they really want to proceed.
public PageReference ValidateAndSaveRecord() {
PageReference result = null;
if(causeValidationWarning){
validationWarning = 'This is a validation warning, hit Ok if you\'re sure you want to proceed.';
}
else {
validationWarning = '';
result = SaveRecord();
}
return result;
}
// Clears the validation warning so the ui won't try and display a confirmation box to the user
public void clearvalidationWarning(){
validationWarning = '';
}
// Actually saves the record and then performs some post save function. Could be anything from displaying a save message (which means
// we'd need to clear the validation warning to keep the confimation pop from appearing), or it could even be a redirect somewhere else.
public PageReference SaveRecord() {
ApexPages.Message myMsg = new ApexPages.Message(ApexPages.Severity.CONFIRM, 'Save Complete!', 'And I totally could have redirected you or something.');
ApexPages.addMessage(myMsg);
clearvalidationWarning();
return null;
}
// Just to prove that our Validation & Save logic won't affect other functionality
public PageReference DoSomething() {
ApexPages.Message myMsg = new ApexPages.Message(ApexPages.Severity.INFO, 'I did some other work.');
ApexPages.addMessage(myMsg);
return null;
}
}
然后创建一个视觉力页面:
<apex:page controller="ActionFunctionCLS" id="pg" showHeader="true" sidebar="true">
<apex:includeScript value="{!$Resource.jquery}"/>
<script>
var j$ = jQuery.noConflict(); //Needed for jQuery usage
j$(document).ready(function(){
var validationWarningMsg = "{!validationWarning}";
if(validationWarningMsg != ''){ // There was a validation warning, make sure the user still wants to save
if(confirm(validationWarningMsg)){
saveRecordAction();
}
else {
clearvalidationWarningAction();
}
}
});
</script>
<apex:form id="myForm">
<apex:pageMessages />
<apex:actionfunction name="saveRecordAction" action="{!SaveRecord}" />
<apex:actionfunction name="clearvalidationWarningAction" action="{!clearvalidationWarning}" />
<apex:pageBlock tabStyle="Account">
<apex:pageBlockButtons >
<apex:commandButton value="Save Record" action="{!ValidateAndSaveRecord}" />
<apex:commandButton value="Do Other Work" action="{!DoSomething}" />
</apex:pageBlockButtons>
<apex:pageBlockSection title="Stuff" columns="1" >
<apex:inputCheckbox value="{!causeValidationWarning}" label="Cause a validation warning" />
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
然后试试吧! apex:actionFunction是我最喜欢的一个,它允许你直接从javascript调用控制器方法,没有任何丑陋的编码,非常简洁的东西。
这里发生的是保存按钮调用ValidateAndSaveRecord(),它运行我们的假想验证,然后实际保存,如果一切看起来都不错。如果不是,它在控制器上设置字符串属性并返回。页面上的javascript在页面加载时查找此字符串,如果找到,则显示确认弹出窗口。
当用户点击Ok时,另一个ajax调用是Save(),但跳过验证,因为已经完成了。如果他们单击取消,则仍会进行调用以清除警告字符串,以便下一个回发不会导致页面再次显示弹出窗口。 这一步非常重要!
我认为我的解决方案可能会让人心痛,因为它取决于取消这么大的取消,但我的经验非常可靠。享受。