Forms Crm 2011-如何根据属性值设置默认表单(不使用Javascript)?

Forms Crm 2011-如何根据属性值设置默认表单(不使用Javascript)?,forms,dynamics-crm-2011,Forms,Dynamics Crm 2011,我有一个让我发疯的小要求: 我们有8种不同形式的联系人实体。 我们还有一个选择列表,有8个选项。 其思想是,基于所选的选项,我们可以打开联系人记录,默认情况下显示特定的表单,而不使用JAVASCRIPT,以避免性能问题(每个记录必须加载两次)。例如: 表格: 表格1 表格2 表格三 拾取列表值-默认形式: 表格1 表格2 表格三 如果选择了表格3(选择列表值),则下次我打开该记录时,默认情况下应显示表格3 如果选择了表格1(选择列表值),则下次打开该记录时,默认情况下应显示表格1 我尝试在sys

我有一个让我发疯的小要求: 我们有8种不同形式的联系人实体。 我们还有一个选择列表,有8个选项。 其思想是,基于所选的选项,我们可以打开联系人记录,默认情况下显示特定的表单,而不使用JAVASCRIPT,以避免性能问题(每个记录必须加载两次)。例如:

表格:
表格1
表格2
表格三

拾取列表值-默认形式:

表格1
表格2
表格三

如果选择了表格3(选择列表值),则下次我打开该记录时,默认情况下应显示表格3

如果选择了表格1(选择列表值),则下次打开该记录时,默认情况下应显示表格1

我尝试在systemform实体中注册一个插件,在RetrieveFilteredForms消息中,更新userentityuisettings表,并且我能够设置一个“默认值”,该值在每次打开记录时都会显示,无论最后打开的表单是什么


我尝试过在contact实体中注册插件,在Retrieve message中,更新userentityuisettings表,但我发现Crm只在没有更新属性的情况下查询该表一次,以下时间Crm采用默认形式从缓存中打开值。

编辑:之后指定的OP需要不带javascript的解决方案,我将此回复留作将来参考

您可以使用javascript,在OnLoad事件中检查picklist值并导航到所需的表单。以这段代码为例

var value=Xrm.Page.getAttribute(“new_optionset”).getValue();
开关(值){
案例100000000:
Xrm.Page.ui.formSelector.items.get(0.navigate();
打破
案例10000001:
Xrm.Page.ui.formSelector.items.get(1.navigate();
打破
案例10000002:
Xrm.Page.ui.formSelector.items.get(2.navigate();
打破
///……这里还有其他案件
违约:
//没有值时打开的默认窗体
Xrm.Page.ui.formSelector.items.get(0.navigate();
}

编辑:在指定OP之后,他需要一个没有javascript的解决方案,我将此回复留作将来参考

您可以使用javascript,在OnLoad事件中检查picklist值并导航到所需的表单。以这段代码为例

var value=Xrm.Page.getAttribute(“new_optionset”).getValue();
开关(值){
案例100000000:
Xrm.Page.ui.formSelector.items.get(0.navigate();
打破
案例10000001:
Xrm.Page.ui.formSelector.items.get(1.navigate();
打破
案例10000002:
Xrm.Page.ui.formSelector.items.get(2.navigate();
打破
///……这里还有其他案件
违约:
//没有值时打开的默认窗体
Xrm.Page.ui.formSelector.items.get(0.navigate();
}

这是一个老问题,但由于我在搜索这个问题时遇到了这个问题,所以我想添加我的解决方案

我们使用Dynamics CRM 2013。据我所知,2011年的更高版本也支持这种技术

打开实体时显示的表单由以下几项决定:默认表单、表单的安全角色和回退设置,以及当前用户为该实体使用的最后一个表单。我们遇到了与询问者类似的问题,我们希望根据表单的值显示不同的帐户表单。我们也厌倦了javascript技术所面临的不断的重新加载/刷新

我发现一些博客文章(特别是这篇:)提到可以编写一个插件来检索实体,允许您从存储上次使用的表单的UserEntityUI设置中读取值(LastViewedFormXml)。如果它不是您想要的形式,您可以写入所需的值。这避免了javascript表单刷新

我不得不修改我发现的示例中的一些代码以使其正常工作,但我对结果感到满意。您需要使用CrmSvcUtil生成一个实体类,并将其包含在项目中。您可以从表单编辑器的url获取表单GUID

using System;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Client;

namespace CRM.Plugin.AccountFormSwitcher
{
    public class Plugin : IPlugin
    {
        public enum accountType
        {
            Customer =  100000000,
            Vendor =     100000001,
            Partner = 100000002,
            Other =    100000003
        }

        public const string CustomerAccountFormId = "00000000-E53C-4DF4-BC99-93856EDD168C";
        public const string VendorAccountFormId = "00000000-E49E-4197-AB5E-F353EF0E806E";
        public const string PartnerAccountFormId = "00000000-B8C6-4E2B-B84E-729AA11ABE61";
        public const string GenericAccountFormId = "00000000-8F42-454E-8E2A-F8196B0419AF";

        public const string AccountTypeAttributeName = "cf_accounttype";

        public void Execute(IServiceProvider serviceProvider)
        {
            if (serviceProvider == null)
            {
                throw new ArgumentNullException("serviceProvider");
            }

            // Obtain the execution context from the service provider.
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

            var pluginContext = (IPluginExecutionContext)context;
            if (pluginContext.Stage == 20) //pre-operation stage
            {
                var columns = (ColumnSet)pluginContext.InputParameters["ColumnSet"];
                if (!columns.Columns.Contains(AccountTypeAttributeName))
                    columns.AddColumn(AccountTypeAttributeName);
            }
            else if (pluginContext.Stage == 40) //post-operation stage
            {
                EntityReference currentEntity = (EntityReference)context.InputParameters["Target"];
                if (currentEntity == null)
                    return;

                var query = new QueryExpression(Account.EntityLogicalName);
                query.Criteria.AddCondition("accountid", ConditionOperator.Equal, currentEntity.Id);
                query.ColumnSet = new ColumnSet(AccountTypeAttributeName);
                var accounts = service.RetrieveMultiple(query).Entities;
                Account currentAccount = (Account)accounts[0];

                SetForm(currentAccount, service, context.UserId);
            }
        }

        private void SetForm(Account account, IOrganizationService service, Guid userId)
        {
            var query = new QueryExpression(UserEntityUISettings.EntityLogicalName);
            query.Criteria.AddCondition("ownerid", ConditionOperator.Equal, userId);
            query.Criteria.AddCondition("objecttypecode", ConditionOperator.Equal, Account.EntityTypeCode);
            query.ColumnSet = new ColumnSet("lastviewedformxml");
            var settings = service.RetrieveMultiple(query).Entities;

            // Some users such as SYSTEM have no UserEntityUISettings, so skip.
            if (settings == null || settings.Count != 1 || account.cf_AccountType == null) return;

            var setting = settings[0].ToEntity<UserEntityUISettings>();
            string formToUse;
            switch ((accountType)account.cf_AccountType.Value)
            {
                case accountType.Customer:
                    formToUse = String.Format("<MRUForm><Form Type=\"Main\" Id=\"{0}\" /></MRUForm>", CustomerAccountFormId);
                    break;
                case accountType.Vendor:
                    formToUse = String.Format("<MRUForm><Form Type=\"Main\" Id=\"{0}\" /></MRUForm>", VendorAccountFormId);
                    break;
                case accountType.Partner:
                    formToUse = String.Format("<MRUForm><Form Type=\"Main\" Id=\"{0}\" /></MRUForm>", PartnerAccountFormId);
                    break;
                case accountType.Other:
                    formToUse = String.Format("<MRUForm><Form Type=\"Main\" Id=\"{0}\" /></MRUForm>", GenericAccountFormId);
                    break;
                default:
                    formToUse = String.Format("<MRUForm><Form Type=\"Main\" Id=\"{0}\" /></MRUForm>", GenericAccountFormId);
                    return;
            }

            // Only update if the last viewed form is not the one required for the given opportunity type
            if (!formToUse.Equals(setting.LastViewedFormXml, StringComparison.InvariantCultureIgnoreCase))
            {
                var s = new UserEntityUISettings { Id = setting.Id, LastViewedFormXml = formToUse };
                service.Update(s);
            }
        }
    }
}
使用系统;
使用System.Collections.ObjectModel;
利用制度全球化;
使用System.Linq;
使用System.ServiceModel;
使用System.ServiceModel.Description;
使用Microsoft.Xrm.Sdk;
使用Microsoft.Xrm.Sdk.Messages;
使用Microsoft.Xrm.Sdk.Query;
使用Microsoft.Xrm.Sdk.Client;
命名空间CRM.Plugin.AccountFormSwitcher
{
公共类插件:IPlugin
{
公共枚举帐户类型
{
客户=100000000,
供应商=100000000001,
合作伙伴=10000002,
其他=100000003
}
public const string CustomerAccountFormId=“00000000-E53C-4DF4-BC99-93856EDD168C”;
public const string VendorAccountFormId=“00000000-E49E-4197-AB5E-F353EF0E806E”;
public const string PartnerAccountFormId=“00000000-B8C6-4E2B-B84E-729AA11ABE61”;
public const string GenericAccountFormId=“00000000-8F42-454E-8E2A-F8196B0419AF”;
public const string AccountTypeAttributeName=“cf_accounttype”;
public void Execute(IServiceProvider服务提供程序)
{
if(serviceProvider==null)
{
抛出新的ArgumentNullException(“serviceProvider”);
}
//从服务提供程序获取执行上下文。
IPluginExecutionContext上下文=(IPluginExecutionContext)serviceProvider.GetService(类型为(IPluginExecutionContext));
ITracingService tracingService=(ITracingService)serviceProvider.GetService(类型(ITracingService));
IOOrganizationServiceFactory serviceFactory=(IOOrganizationServiceFactory)serviceProvider.GetService(类型为(IOOrganizationServiceFactory));
IOOrganizationService=serviceFactory.CreateOrganizationService(context.UserId);
弗吉尼亚州