重新认识Attributes.add

本文介绍了在ASP.NET中如何正确地使用控件ID.Attributes.add方法来修改控件的样式属性,强调了对于style属性的正确操作方式,并分享了实践中遇到的问题及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  昨天自己学习别人的编码,发现了 控件ID.Attributes.add("","");用法,于是自己查来看,中间闹了不少的笑话;

  首先自己就搜错了对象,C#里有 Attributes和Attribute(特性)这两个关键字,新人可千万不要弄混,切记切记!

  其次自己用 控件ID.Attributes.add("",""); 这个用法时,发现用它来给控件添加事件的方法屡试不爽,例如 控件ID.Attributes.add("onclick","alert("Error");"); ,可是当我想改变控件长宽等style属性的时候发现,控件ID.Attributes.add("width","80px"); 这样就不行了。

 遂拿到技术群里去讨论这个问题,经高手的指点发现自己确实忽略了重要的东西;

 在HTML中,服务器端控件的长宽等style属性是通过style="" 来控制的,即使用ASP.NET工具箱里控件,虽然可以在style外写 width=""来控制宽度等属性,

但是当我在浏览器中查看代码的时候发现,这个控件的属性设置还是写在style="width:80px"里的,被浏览器渲染成<input name="TextBox1" id="TextBox1" style="width: 768px;" type="text"/>

所以我们用 控件ID.Attributes.add("width","80px");的时候,就被浏览器渲染成了<input name="TextBox1" id="TextBox1" width= "768px" type="text"/>,这样当然没有效果;

如果需要在后台用Attributes的方式来改变控件的样式,我们需要这样写:控件ID.Attributes.style.add("","");方式。

切记切记

转载于:https://www.cnblogs.com/JhoneLee/archive/2013/02/18/2915197.html

<think>我们正在处理的是DynamicsCRM插件开发中的错误,具体是创建SdkMessageProcessingStepImage(即步骤镜像)时出现的错误:“MessageCreatedoesnotsupportthisimagetype”。这个错误通常发生在为插件步骤(SdkMessageProcessingStep)创建镜像时,我们指定了不支持的镜像类型(ImageType)或与消息(Message)不匹配的镜像类型。在DynamicsCRM中,SdkMessageProcessingStepImage用于在插件执行上下文中提供数据快照(PreImage/PostImage)。不同的消息(如Create,Update,Delete等)支持的镜像类型不同。错误原因分析:根据错误信息,创建镜像时指定的镜像类型(ImageType)不被Create消息支持。具体来说:-Create消息(即创建记录时触发的插件消息)只支持PostImage(创建后的镜像),因为创建前记录不存在,所以不支持PreImage。-Update消息支持PreImage和PostImage。-Delete消息只支持PreImage(删除前的镜像)。因此,当为Create消息的插件步骤尝试创建PreImage时,系统会抛出此错误。解决方案:确保为Create消息的插件步骤只添加PostImage。下面是详细的解决步骤:步骤1:检查镜像类型-确认你的插件步骤对应的消息(SdkMessage)是Create(创建)。-确认你正在创建的SdkMessageProcessingStepImage的ImageType属性设置为1(即PostImage),而不是0(PreImage)。步骤2:创建步骤镜像的代码调整如果你是通过代码创建(例如使用PluginRegistrationTool或自定义代码),请确保在创建SdkMessageProcessingStepImage时,对于Create消息,只使用PostImage。以C#代码创建步骤镜像为例:```csharpvarimage=newSdkMessageProcessingStepImage{//名称(必须是唯一的)Name="MyPostImage",//实体别名,用于在插件上下文中访问此镜像EntityAlias="MyPostImage",//关键:设置镜像类型为PostImageImageType=newOptionSetValue((int)SdkMessageProcessingStepImage.ImageTypeOption.PostImage),//指定要包含的属性集合(用逗号分隔),或者用"*"表示所有属性Attributes="*",//或者"name,email"//关联到插件步骤SdkMessageProcessingStepId=stepRef,//这里的stepRef是之前创建的插件步骤的引用};service.Create(image);```步骤3:使用工具时的注意事项如果你使用PluginRegistrationTool(PRT)创建步骤镜像:-在添加镜像时,在“Image”对话框的“ImageType”下拉框中,对于Create消息只能选择“PostImage”。步骤4:验证创建后,可以在CRM中检查该镜像的ImageType属性是否为PostImage(值为1)。也可以通过数据库查询或使用FetchXml来验证。数学表示:设$M$为消息类型($M\in\{\text{Create},\text{Update},\text{Delete}\}$),$I$为镜像类型($I\in\{\text{PreImage},\text{PostImage}\}$)。支持的组合由以下映射定义:$$f(M,I)=\begin{cases}\text{支持}&\text{if}(M=\text{Create}\landI=\text{PostImage})\\&\text{or}(M=\text{Update}\landI\in\{\text{PreImage},\text{PostImage}\})\\&\text{or}(M=\text{Delete}\landI=\text{PreImage})\\\text{不支持}&\text{otherwise}\end{cases}$$在我们的案例中,$M=\text{Create}$且$I=\text{PreImage}$,因此$f(\text{Create},\text{PreImage})$返回“不支持”,导致错误。步骤5:更新现有配置如果你已经错误地配置了一个PreImage,那么你需要删除它并重新创建一个PostImage。注意事项:1.镜像名称(Name)必须在同一个插件步骤下唯一。2.在插件代码中,你需要使用在镜像中指定的EntityAlias来访问镜像数据。例如:```csharpif(context.PostEntityImages.Contains("MyPostImage")){EntitypostImage=context.PostEntityImages["MyPostImage"];//使用postImage}```总结:创建Create消息的步骤镜像时,确保镜像类型为PostImage(而不是PreImage)即可解决错误。§§相关问题§§1.在DynamicsCRM中,Update消息支持哪些镜像类型?2.如何在插件代码中正确使用PreImage和PostImage?3.为什么Delete消息不支持PostImage?4.在Dynamics365中,如何为自定义动作(Action)配置镜像?</think> ### 解决 Dynamics CRM 中 "Message Create does not support this image type" 错误 在创建 SDK 消息处理步骤镜像 (`SdkMessageProcessingStepImage`) 时出现此错误,通常是由于镜像类型 (`ImageType`) 与消息 (`SdkMessage`) 不兼容造成的。让我们逐步分析问题并提供解决方案: --- ### **错误原因分析** 1. **镜像类型与消息冲突** - `Create` 消息(创建记录时触发)**不支持 PreImage** ∵ 记录创建前不存在实体镜像,只有创建后才存在 (PostImage) - 数学表示:设 $M$ 为消息类型,$I$ 为镜像类型 $f(M,I) = \begin{cases} \text{支持} & \text{if } (M=\text{Update} \land I=\text{PreImage/PostImage}) \\ & \quad \lor (M=\text{Create} \land I=\text{PostImage}) \\ \text{不支持} & \text{if } (M=\text{Create} \land I=\text{PreImage}) \end{cases}$ 2. **常见错误场景** - 为 `Create` 消息的插件注册了 PreImage - 在配置时错误选择镜像类型 - 使用自定义工作流活动时参数传递错误 --- ### **解决方案** #### **步骤 1:验证消息与镜像类型** 在创建 `SdkMessageProcessingStepImage` 时: ```csharp var image = new SdkMessageProcessingStepImage { Name = "PostImage", // 关键设置:Create消息必须使用PostImage ImageType = SdkMessageProcessingStepImage.ImageTypeOption.PostImage, EntityAlias = "target", Attributes = "field1,field2", // 或"*"获取所有字段 MessagePropertyName = "Target", // Create消息必须为Target SdkMessageProcessingStepId = stepRef // 关联的插件步骤 }; service.Create(image); ``` #### **步骤 2:检查消息类型** 1. 查询 `SdkMessage` 的 `Name` 属性: ```sql SELECT Name FROM SdkMessage WHERE SdkMessageId = @messageId ``` 2. 不同消息支持的镜像类型: | 消息类型 | 支持镜像类型 | |--------------|-------------------| | Create | PostImage 仅 | | Update | PreImage/PostImage| | Delete | PreImage 仅 | #### **步骤 3:修复错误配置** 1. **通过代码修复**: ```csharp // 获取错误镜像 var brokenImage = service.Retrieve("sdkmessageprocessingstepimage", imageId, new ColumnSet("imagetype")); // 更新为PostImage(如果是Create消息) brokenImage["imagetype"] = new OptionSetValue(1); // 1=PostImage service.Update(brokenImage); ``` 2. **通过界面修复**(插件注册工具): - 删除错误的 PreImage 配置 - 重新创建时选择: ``` Message: Create Image Type: PostImage ``` --- ### **最佳实践** 1. **镜像类型选择逻辑**: $$ \text{ImageType} = \begin{cases} \text{PreImage} & \text{if } t \in \{\text{Update}, \text{Delete}\} \land \text{需比较变更} \\ \text{PostImage} & \text{其他情况} \end{cases}$$ 其中 $t$ = 消息类型 2. **性能优化**: - 避免使用 `Attributes = "*"`,只选择必要字段 - 对频繁调用的插件启用[异步执行](https://learn.microsoft.com/en-us/power-apps/developer/data-platform/asynchronous-service)[^1] 3. **调试建议**: ```csharp // 在插件代码中验证镜像存在性 if (!context.PostEntityImages.Contains("PostImage")) throw new InvalidPluginExecutionException("Missing PostImage"); ``` --- ### **根本原因总结** 此错误本质上是不满足系统约束: $$ \exists(M,I) \text{ s.t. } M=\text{Create} \land I=\text{PreImage} $$ ⇒ 违反业务规则 $\Rightarrow$ 系统拒绝操作 正确组合应为:$(M=\text{Create}, I=\text{PostImage})$ [^1]: Dynamics 365 SDK: SdkMessageProcessingStepImage Entity Reference.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值