现在的位置: 首页 > 综合 > 正文

MS CRM 2011 如何配置表单接受自定义Querystring参数

2012年10月02日 ⁄ 综合 ⁄ 共 6850字 ⁄ 字号 评论关闭

 

原创地址:http://www.cnblogs.com/jfzhu/archive/2012/09/29/2707943.html

转载请注明出处

 

在前面的两篇文章中,我分别介绍了如何自定义Ribbon按钮并向其传递参数以及Ribbon按钮与其背后JScript的工作原理。在这篇文章中,我结合前面介绍到的知识,再为大家演示一下如何在表单中传递自定义的参数。

 

我们还是以扩展Connect按钮为例子,这一节我们安排”To Interest Partner”这个子选项多做一些事情。如果你点击”Connect To Another”,CRM会为你打开一个Connection的创建表单,我们也为”Connect To Investment Partner”做同样的事情,也打开一个Connection的表单,但是我们要向Connection表单中传递一个自定义的参数。

image

也许有人会问,为什么要向表单传递自定义参数。一个简单的例子,比如你向Connection表单传递一个Connection Role的参数,这样在Connection表单的OnLoad事件中,你就可以读取这个参数,并将表单上的Connection Role直接添好,而不需要用户在手动选择。

 

下面我们还将修改account的Ribbon定义,至于如何修改Ribbon定义,可以参见我前边的文章如何自定义Ribbon按钮并向其传递参数或者SDK。改动后的ribbon定义如下,注意我在command的定义中,增加了两个参数 <StringParameter Value="account" />和<StringParameter Value="Investment Partner" />。它们分别表示account 连接到另一个Entity的类型是account,Connection Role是Investement Partner。

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="mycompany.account.form.ConnectToInvestmentPartner.CustomAction" Location="Mscrm.Form.account.AddConnection.Controls._children" Sequence="42">
      <CommandUIDefinition>
        <Button Id="mycompany.account.form.ConnectToInvestmentPartner.Button" Command="mycompany.account.form.ConnectToInvestmentPartner.Command" LabelText="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.LabelText" ToolTipTitle="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.LabelText" ToolTipDescription="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.ToolTip" />
      </CommandUIDefinition>
    </CustomAction>
    <CustomAction Id="mycompany.account.grid.ConnectToInvestmentPartner.CustomAction" Location="Mscrm.HomepageGrid.account.AddConnection.Controls._children" Sequence="46">
      <CommandUIDefinition>
        <Button Id="mycompany.account.homepagegrid.ConnectToInvestmentPartner.Button" Command="mycompany.account.grid.ConnectToInvestmentPartner.Command" LabelText="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.LabelText" ToolTipTitle="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.LabelText" ToolTipDescription="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.ToolTip" />
      </CommandUIDefinition>
    </CustomAction>
    <CustomAction Id="mycompany.account.subgrid.ConnectToInvestmentPartner.CustomAction" Location="Mscrm.SubGrid.account.AddConnection.Controls._children" Sequence="21">
      <CommandUIDefinition>
        <Button Id="mycompany.account.subgrid.ConnectToInvestmentPartner.Button" Command="mycompany.account.grid.ConnectToInvestmentPartner.Command" LabelText="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.LabelText" ToolTipTitle="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.LabelText" ToolTipDescription="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.ToolTip" />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="mycompany.account.form.ConnectToInvestmentPartner.Command">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled" />
      </EnableRules>
      <DisplayRules />
      <Actions>
        <JavaScriptFunction Library="$webresource:new_AccountLibrary.js" FunctionName="AccountLibrary.AddConnectionToInvestmentPartner">
          <CrmParameter Value="FirstPrimaryItemId" />
          <CrmParameter Value="PrimaryEntityTypeCode" />
          <CrmParameter Value="PrimaryEntityTypeName" />
          <StringParameter Value="account" />
          <StringParameter Value="Investment Partner" />
        </JavaScriptFunction>
      </Actions>
    </CommandDefinition>
    <CommandDefinition Id="mycompany.account.grid.ConnectToInvestmentPartner.Command">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled" />
      </EnableRules>
      <DisplayRules />
      <Actions>
        <JavaScriptFunction Library="$webresource:new_AccountLibrary.js" FunctionName="AccountLibrary.AddConnectionToInvestmentPartner">
          <CrmParameter Value="FirstSelectedItemId" />
          <CrmParameter Value="SelectedEntityTypeCode" />
          <CrmParameter Value="SelectedEntityTypeName" />
          <StringParameter Value="account" />
          <StringParameter Value="Investment Partner" />
        </JavaScriptFunction>
      </Actions>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules />
    <DisplayRules />
    <EnableRules />
  </RuleDefinitions>
  <LocLabels>
    <LocLabel Id="mycompany.account.form.ConnectToInvestmentPartner.LabelText">
      <Titles>
        <Title languagecode="1033" description="To Investment Partner" />
        <Title languagecode="2052" description="投资伙伴" />
      </Titles>
    </LocLabel>
    <LocLabel Id="mycompany.account.form.ConnectToInvestmentPartner.ToolTip">
      <Titles>
        <Title languagecode="1033" description="To Investment Partner" />
        <Title languagecode="2052" description="投资伙伴" />
      </Titles>
    </LocLabel>
  </LocLabels>
</RibbonDiffXml>

下面我们修改AccountLibrary.js web resource。内容如下。

if (typeof (AccountLibrary) == "undefined") {
    AccountLibrary = { __namespace: true };
}


AccountLibrary = {
    Name: "AccountLibrary",
    AddConnectionToInvestmentPartner: function (accountid, objecttypecode, objecttypename, connectoType, connectionRole) {
        try {
            var $v_0 = String.format("pId={0}&pType={1}&pConnectToEntity_0={2}&pConnectAsRole_0={3}",
                CrmEncodeDecode.CrmNameValueEncode(accountid),
                CrmEncodeDecode.CrmNameValueEncode(objecttypecode.toString()),
                CrmEncodeDecode.CrmNameValueEncode(connectoType),
                CrmEncodeDecode.CrmNameValueEncode(connectionRole));
            openObj(Mscrm.EntityTypeCode.Connection, "", $v_0, null, Mscrm.NavigationMode.NavigationModeNewWindow, null) 
        }
        catch (e) {
            alert(AccountLibrary.Name + " AddConnectionToInvestmentPartner Error: " + e.Message);
        }
    }
} 

因为我们上一节已经学习了系统自带的Connect To Another是如何打开一个Connection创建表单的,我们对其加以修改。注意我们在url中添加了两个自定义参数,pConnectToType和pConnectionRole。保存并publish你的web resource,试着点击一下Connect To Investment Partner,你会发现Connection的创建表单是打开了,但是产生了一个错误:

image

这个错误就是由我们的自定义参数pConnectToEntity_0和pConnectAsRole_0引起的。CRM是不允许你随便向一个表单传递自定义Querystring的。不过这是可以通过修改entity的xml定义来改变的。我下面给大家演示如何进行这个改动。详情大家也可以参考sdk - Configure a Form to Accept Custom Querystring Parameters这一章节。

 

在CRM中,还是使用你原来使用的那个Solution,也可以新建一个,把connection entity包含进来,并新创建一个Jscript web resource, 我们命名它为ConnectionLibrary.js。导出solution,修改customizations.xml文件,对connection entity的定义进行修改。有一点需要注意的事比较变态,就是变量命必须包含一个下划线。

image

再将下面的内容复制到ConnectionLibrary.js web resource中。

 

if (typeof (ConnectionLibrary) == "undefined") {
    ConnectionLibrary = { __namespace: true };
}


ConnectionLibrary = {
    Name: "ConnectionLibrary",
    CONST_PARA_CONNECT_TO_ENTITY: "pConnectToEntity_0",
    CONST_PARA_CONNECT_AS_ROLE: "pConnectAsRole_0",
    IsConnectingToParam: function (params) {
        for (i = 0; i < params.length; i++) {
            var param = params[i].split("=");
            if (param[0] == ConnectionLibrary.CONST_PARA_CONNECT_TO_ENTITY) {
                return true;
            }
        }
        return false;
    },
    GetRoleName: function (params) {
        for (i = 0; i < params.length; i++) {
            var param = params[i].split("=");
            if (param[0] == ConnectionLibrary.CONST_PARA_CONNECT_AS_ROLE) {
                return param[1];
            }
        }
        throw "Role Name is not defined.";
    },
    OnLoad: function () {
        if (Xrm.Page.ui.getFormType() == 1) {
            var queryString = window.location.search.substring(1);
            var params = queryString.split("&");
            if (ConnectionLibrary.IsConnectingToParam(params)) {
                var rolename = CrmEncodeDecode.CrmNameValueDecode(ConnectionLibrary.GetRoleName(params));
                alert(rolename);
            }
        }
    }
} 

这段代码中有一点需要注意,我们在上一篇文章中介绍了CrmEncodeDecode.CrmNameValueEncode,有encode自然也要有decode,所以这里我们使用了CrmEncodeDecode.CrmNameValueDecode。

 

最后,我们来看一下结果:

image

抱歉!评论已关闭.