【问题标题】:Cannot access Xrm.Page.data from within HTML web resource in CRM 2011无法从 CRM 2011 中的 HTML Web 资源中访问 Xrm.Page.data
【发布时间】:2014-03-14 10:51:45
【问题描述】:

我正在尝试从插入到 CRM 2011 表单中的 HTML Web 资源中访问 Xrm.Page.data 对象。但是,根据我尝试访问 Xrm 实体的方式,我发现它是未定义或 Xrm.Page.data 为空。网页资源的代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<script type="text/javascript">

function OpenMyApp(e){
    alert('Xrm defined: ' + (typeof Xrm != 'undefined'));
        // The line above returns the string 'Xrm defined: false'

    alert('window.top.opener.parent.Xrm defined: ' + (typeof window.top.opener.parent.Xrm != 'undefined'));
        // The line above returns the string 'window.top.opener.parent.Xrm defined: true'


    alert('frames[0].Xrm defined: ' + (typeof frames[0].Xrm != 'undefined'));
        // the line above will actually throw an error and stop the script, because the frames collection is empty. 

    alert(window.top.opener.parent.Xrm.Page.data);
        // the line above returns null. 

    // var myId = Xrm.Page.data.entity.attributes.get("new_field_i_want").getValue();
        // The line above is what I would like to see work. 

    e.preventDefault();
 }
</script>

</head>
<body>
<a onClick="OpenMyApp(event);" href="#">My Link</a>
</body>
</html>

我已经从一个 JavaScript 函数中成功访问了 Xrm.Page.data,该函数是在表单事件(例如 Form.Load)时触发的库的一部分。只是当它嵌入到表单上的 HTML Web 资源中时,我遇到了这个问题。谁能解释我做错了什么,如果真的有办法以我想做的方式访问 Xrm.Page.data 吗?

谢谢。

【问题讨论】:

    标签: javascript html dynamics-crm-2011


    【解决方案1】:

    尝试使用以下语法访问 Xrm:

    window.parent.Xrm.Page.getAttribute()...
    
    window.parent.Xrm.Page.getControl()...
    
    window.parent.Xrm.Page.context...
    

    喜欢

    alert(window.parent.Xrm.Page.data.entity.attributes.get("new_field_i_want").getValue());
    

    来自您的示例代码。

    【讨论】:

    • 我也有同样的问题。我在 Chrome 37 中运行它。我在实体表单的 IFrame 中显示了一个网络资源。我已经尝试了所有组合,但仍然无法获得 Xrm 对象。帮助将不胜感激!
    • 您可以使用var Xrm = window.parent.Xrm;,因此每个Xrm 调用不需要以window.parent 为前缀。 @Taha Ahmad,如果未定义 Xrm,请尝试 frames[0].Xrmframes[1].Xrm。所以你可以做var Xrm.Page.data = Xrm.Page.data || frames[0].Xrm.Page.data || frames[1].Xrm.Page.data || window.parent.Xrm.Page.data;。类似于我的answer 关于识别脏字段。
    【解决方案2】:

    这适用于当您有一个在 iframe/对话框中加载的网络资源时。它访问父框架,然后查找所有可用的框架,并检查哪个框架有

    Xrm.Page.data != null

    代码...

    $.each(parent.window.frames, function(i,val){   
        if (parent.window.frames[i].Xrm.Page.data != null) {
               parent.window.frames[i].Xrm.Page.data.entity.attributes.get('ownerid').setValue([{ id: '{' + sourceKey + '}', name: name, entityType: "systemuser" }]);
               parent.window.frames[i].Xrm.Page.data.entity.save();
               break;
        }
    });   
    

    【讨论】:

      【解决方案3】:

      根据 TWilly 的回答,我创建了下面的函数来检索 Xrm 对象

      GetXrm: function () {
      
          var frame = $.grep(parent.window.frames, function (e) {
              if (e.Xrm.Page.data)
                  return true;
           });
      
           return frame[0].Xrm;
      }
      

      【讨论】:

        【解决方案4】:

        在此之前设置 Xrm:

          var Xrm = parent.Xrm;
            var Url = Xrm.Page.data.entity.attributes.getByName("attributename").getValue();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-22
          相关资源
          最近更新 更多