我有一个问题,我正在努力弄清楚如何才能最好地解决这个问题。我已经阅读了有关此错误的各种帖子,您似乎可以通过使用JavaScript来避免这种情况:
Xrm.Page.getAttribute("name").setSubmitMode("always");
对我或插件内部不起作用。现在我的问题是,我的事件表单上有一个更新插件,它会更新一些字段。然而,当我尝试解决这个案例或取消它时,我从我的更新插件中得到错误“该对象无法更新,因为它是只读的”我尝试了以下内容并且会感谢somone可以告诉我我在做什么错误。我的插件代码我在事件形式的预操作中注册为SetState:
SetStateRequest setState = new SetStateRequest();
setState.EntityMoniker = new EntityReference();
setState.EntityMoniker.Id = incidentId; //Id which needs to be resolved/canceld
setState.EntityMoniker.Name = "statecode";
setState.EntityMoniker.LogicalName = "incident";
setState.State = new OptionSetValue();
setState.Status = new OptionSetValue();
SetStateResponse setStateResponse = (SetStateResponse)service.Execute(setState); }
关于状态和状态,我很困惑,我必须设置它的价值。当我的事件处于活动状态并且我正在尝试解决并取消案例时,我只是收到错误。如果有人能帮助我,我将不胜感激。提前谢谢。
答案 0 :(得分:4)
我认为你的帖子中有一些混乱的地方......
Xrm.Page.getAttribute("name").setSubmitMode("always");
这是客户端代码,永远不会影响您的(服务器端)插件的行为。它只是在保存期间强制提交表单上的属性,无论它是否已更改。如果记录处于只读状态,则不会改变这一事实。
我一点也不清楚你想要在你的代码中实现什么。你提到更新插件失败了;你已经发布了试图将事件状态设置为某些内容的代码(正如@glosrob建议的那样,你没有在OptionSetValue
和State
的{{1}}个对象中提供任何值,所以您可能已经知道,您发布的代码无效);然后,您说明您已在Status
请求中注册了您的插件。这意味着如果用户尝试设置SetState
的状态,它将触发。鉴于您的代码本身正在尝试设置incident
的状态,我不确定它是否有意义......
听起来你想要做的是,在更新incident
时,设置某些值。如果事件处于只读状态,请先使其可读,然后更新值。那么您是否需要将实体的状态恢复到以前的状态?这听起来很尴尬,或许可能表明有更好的方法来满足您的核心要求。
也许从你想要实现的目标开始,我们可以从那里开始工作:)
答案 1 :(得分:3)
你应该删除
setState.EntityMoniker.Name = "statecode";
来自您的代码。此字段Name
有其他用途。
另外,你应该添加
setState.State.Value = 1;
setState.Status.Value = -1;