我正在从功能区按钮执行一些javascript,我想要做的是保存我正在创建的记录,然后立即将其GUID用于某些代码。每次我尝试它时,即使我在保存记录后请求它,GUID也会返回null。如果我在保存之后再次尝试按钮,那么它可以工作,但不是因为我正在保存它。
有办法做到这一点吗?
function RibbonButton_AddProduct()
{
//Save the Record
Xrm.Page.data.entity.save();
LoadProductCreate();
}
function LoadProductCreate()
{
var serverUrl;
var errorMessage = "Context to retrieve the Server URL is not available.";
if (typeof GetGlobalContext != "undefined"){
serverUrl = GetGlobalContext().getServerUrl();
} else {
if (typeof Xrm != "undefined"){
serverUrl = Xrm.Page.context.getServerUrl();
} else {
alert(errorMessage);
return;
}
}
if (serverUrl.match(/\/$/)){
serverUrl = serverUrl.substring(0, serverUrl.length - 1);
}
var recordId = Xrm.Page.data.entity.getId();
alert(recordId);
var url = serverUrl + "/main.aspx?etc=10030&extraqs=%3f_CreateFromId%3d%"+recordId
+"%257d%26_CreateFromType%3d10029%26etc%3d10030%26"
+"pagemode%3diframe%26preloadcache%3d1345465354543&pagetype=entityrecord";
window.open(url);
}
答案 0 :(得分:9)
这是解决此问题的另一种方法。
你要做的是“对抗系统” - 你实际上是在制作两个保存按钮。在Crm的其余部分,当功能区按钮需要Id时,必须首先保存记录。例如。您无法在未保存的记录上使用对话框或工作流程按钮,也无法将“新建/现有”添加到未保存的记录中。
所以我的解决方案是禁用未保存表单上的按钮,强制用户手动保存记录然后允许他们使用你的按钮 - 这就是Crm的使用方式,其余部分就是这样Crm会起作用。
你不应该反对系统,你应该使用它,你有一个产品来定制和扩展 - 而不是改变。
如果这不符合您的要求,我会建议使用Greg的建议(1)有标志,虽然听起来有点乱 - 但是这是一个固有的要求。
答案 1 :(得分:4)
您可以尝试以下两种方法之一:
为表单添加一个隐藏的布尔属性(例如“new_launchProductCreate”),在保存之前在代码中设置它,然后在onLoad上读取它。
您可以创建一个针对记录的“创建”步骤注册的插件,而不是在创建之前设置值(因此可能会将其提交到数据库),该插件会将一个布尔值注入{{1将记录返回给用户时收集。这样可以防止值持久存储到数据库中并在每次加载表单时运行。
您可以在启动onLoad代码时使用AJAX重置值,以便在每次表单加载时都不会触发
手动分配记录guid,使用AJAX保存记录,使用新的guid弹出新窗口,然后重新加载原始表单(以便表单不再处于“未保存”状态)。 / p>
答案 2 :(得分:2)
冒着被证明是错误的风险,因为我无法立即验证这一点......您需要保存然后重新加载页面。
存储在Xrm.Page.data.entity.getId()
中的值在页面加载/初始化时设置,因此在您调用Save()
后访问它时将不会更新。
这也是您重新加载页面时的效果。
也许您可以调用save然后重新加载窗口添加自己的querystring变量,以表明此事件刚刚发生?
e.g。
function DoSomething() {
//do your stuff
Xrm.Page.data.entity.save();
//something like - sure someone can do better!
window.location = window.location.href + '&foo=bar';
}
然后在onFormLoad
上注册这样的内容function OnLoad() {
var queryStringParms = Xrm.Page.context.getQueryStringParameters();
//test to see if your query string param exists here
for (var i in queryStringParams) {
//if you find query string, do extra processing here
}
}