Forms Crm 2011-如何根据属性值设置默认表单(不使用Javascript)?
我有一个让我发疯的小要求: 我们有8种不同形式的联系人实体。 我们还有一个选择列表,有8个选项。 其思想是,基于所选的选项,我们可以打开联系人记录,默认情况下显示特定的表单,而不使用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
表格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);
弗吉尼亚州