Dynamics crm 2011 可复制值的不可更改表单字段的最佳实践(2011/2013在线)

Dynamics crm 2011 可复制值的不可更改表单字段的最佳实践(2011/2013在线),dynamics-crm-2011,dynamics-crm,crm,dynamics-crm-online,Dynamics Crm 2011,Dynamics Crm,Crm,Dynamics Crm Online,我需要能够在案例表单上显示案例字段(ticketnumber),以便 用户无法更改该值 可以从字段复制值(CTRL-C+右键单击/复制) 在所有crm支持的浏览器上工作的解决方案 使用outlook作为客户端的解决方案 解决方案必须使用支持的方法 我尝试过将字段设置为只读,这使得它在IE8/2013和其他客户端组合中不可复制 我只是想知道在我花时间之前,是否有人想出了最好的方法。我很想使用html资源,但这似乎有些过头了…将字段添加到表单的页眉或页脚。您现在只需选择字段即可复制该字段,因为它只是

我需要能够在案例表单上显示案例字段(ticketnumber),以便

  • 用户无法更改该值
  • 可以从字段复制值(CTRL-C+右键单击/复制)
  • 在所有crm支持的浏览器上工作的解决方案
  • 使用outlook作为客户端的解决方案
  • 解决方案必须使用支持的方法
  • 我尝试过将字段设置为只读,这使得它在IE8/2013和其他客户端组合中不可复制


    我只是想知道在我花时间之前,是否有人想出了最好的方法。我很想使用html资源,但这似乎有些过头了…

    将字段添加到表单的页眉或页脚。您现在只需选择字段即可复制该字段,因为它只是文本,但无法编辑

    确保此业务规则在插件中强制执行,否则用户可能会意外(或有意)通过批量编辑、Excel导入、OData、API等进行更改

    已编辑

    由于IE9不允许您从页眉/页脚进行复制,您可以执行以下操作:

  • 编写JavaScript OnLoad事件以获取字段的现有值
  • 编写一个Javascript OnChange事件,如果用户更改了值,该事件会将字段更改为初始值。(我还会添加一个弹出窗口,告诉用户该字段无法编辑,以避免出现问题。)
  • 这是受支持的方法

    不受支持的做法是,通过在表单中添加OnLoad事件处理程序来取消按键事件,然后在相应字段中添加OnKeyDown事件处理程序,风险由您自己承担:

    function OnLoad(){
         document.getElementById("new_field").onkeydown = 
              function(evt) { return false; };
    }
    

    只需将
    “新字段”
    更新为适当的字段名即可。任何编辑该字段的尝试都将被阻止。

    在此处回答我自己的问题。我最终使用了一个只需一个按钮的web资源。如果是新表单,我将使用按钮text=“保存前无信息”禁用该按钮。如果我感兴趣的字段有值,我将使用按钮文本=
    字段值启用按钮

    按下按钮使用方便的按钮

    在每个客户身上都很有效。Web资源不会显示在outlook阅读窗格中,但默认情况下,我会在表单上看到感兴趣的字段,以便该字段的副本显示在阅读窗格中。加载表单时,我将该字段设置为不可见,以便用户只看到web资源

    Nicknow的javascript处理程序解决方案也会起作用

    更新

    最后,我使用了一个只读文本元素,并在单击时自动选择文本。代码如下:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <script type="text/javascript" src="/WebResources/ClientGlobalContext.js.aspx"></script>
        <meta charset="utf-8">
    </head>
    <body style="margin: 0px; padding: 0px;" onload="onload()">
    <input id="fieldElement" onclick="onClickElement(this)" readOnly="true" value="save case for number" type="text">
    
    <script>
        var FORM_TYPE_UPDATE = 2;
        var FORM_TYPE_READ_ONLY = 3;
        var FORM_TYPE_DISABLED = 4;
    
        function onload()
        {
            if (parent.Xrm.Page.ui.getFormType() == FORM_TYPE_UPDATE ||
                parent.Xrm.Page.ui.getFormType() == FORM_TYPE_READ_ONLY ||
                parent.Xrm.Page.ui.getFormType() == FORM_TYPE_DISABLED)
            {
                var value = parent.Xrm.Page.getAttribute('ticketnumber').getValue();
                document.getElementById("fieldElement").value = value;
            }
            else
            {
                // must be a create. handled by default setup
            }
    
            return;
        }
        function onClickElement(element)
        {
            element.select();
        }
    
    </script>
    </body>
    </html>
    
    
    var FORM_TYPE_UPDATE=2;
    变量形式类型只读=3;
    var FORM_TYPE_DISABLED=4;
    函数onload()
    {
    if(parent.Xrm.Page.ui.getFormType()==表单类型更新||
    parent.Xrm.Page.ui.getFormType()=表单类型只读||
    parent.Xrm.Page.ui.getFormType()==表单类型(已禁用)
    {
    var value=parent.Xrm.Page.getAttribute('ticketnumber').getValue();
    document.getElementById(“fieldElement”).value=value;
    }
    其他的
    {
    //必须是创建。默认设置下已处理
    }
    返回;
    }
    函数onClick元素(元素)
    {
    元素。选择();
    }
    
    我尝试了页眉/页脚,但在Outlook 2010/IE9中,这样的字段不能在表单上复制。到目前为止,我发现在任何地方都有效的唯一方法是使用web资源来显示单个字段。在HTML中,如何将字段值写入HTML也很重要。写(…)作品。将innerhtml注入到div中没有。好吧……我已经用IE10测试过了,但没有用IE9测试过-没有意识到你不能双击以突出显示IE9中的页眉/页脚字段。为满足此要求添加了一些新想法。非常感谢你的建议。任何不受支持的解决方案都适用于我(将更新问题)。我考虑过JS处理程序,它可以工作,但是很笨重。我实现了web资源,但在填充/边距方面遇到了问题。当我弄明白后,我会再次更新。哇,这太糟糕了。仅显示文本的web资源在2011年的更新表单上不可复制,在outlook呈现的ie9表单中也不可复制。2011/IE9和2013/IE9(创建/更新)中可复制完全相同的web资源。底线是,若使用IE8或9以及outlook和浏览器客户端,那个么我能看到的获得完全可复制字段的唯一方法就是使用上面的JS hack