我正在使用以下代码尝试从Silverlight应用程序更新CRM 2011系统中的查找字段值:
try
{
ma.my_ActionDetails = details;
Guid userId = new Guid();
foreach (SystemUser s in SystemUsers)
{
if (s.FullName.Equals(comboBox1.SelectedItem))
{
userId = s.SystemUserId;
}
}
// Define eval statements for setting lookup to a value and null
string setLookupJscript = @"Xrm.Page.getAttribute(""{0}"").setValue([ {{ id: ""{1:B}"", typename: ""{2}"", name: ""{3}"" }}])";
string evalStatement = null;
// Set the statement to be evaluated based upon the value of the id argument
// Setting the lookup to a value
evalStatement = string.Format(setLookupJscript, "my_salesperson", userId, "my_memberaction", ma.my_SalesPerson.Name);
HtmlPage.Window.Eval(evalStatement);
_context.UpdateObject(ma);
_context.BeginSaveChanges(OnUpdateAccountComplete, ma);
}
catch (SystemException se)
{
_syncContext.Send(new SendOrPostCallback(showErrorDetails), se);
}
但是,当我运行此代码时,它会生成以下错误:
在浏览器中:
'Xrm' is undefined
来自代码:
System.InvalidOperationException: [Common_MethodFailed]
谁能解释一下这里发生了什么?
谢谢,
杰克
答案 0 :(得分:1)
您需要位于CRM表单的上下文中,才能使Xrm名称空间可用。你是从表单中运行的吗?
来自CRM SDK:
如果您的Silverlight Web资源设计为以实体形式查看,则表单中有一个Xrm.Page.context对象,您可以使用该对象访问上下文信息。
如果您需要将Silverlight应用程序显示在表单的上下文之外,则必须通过添加对ClientGlobalContext.js.aspx页面的引用来配置HTML Web资源以提供此上下文信息。添加此引用后,Silverlight应用程序可以以与实体形式相同的方式访问上下文信息。以下示例显示如何从Xrm.Page.context对象调用getServerUrl函数。
private string serverUrl = "";
ScriptObject xrm = (ScriptObject)HtmlPage.Window.GetProperty("Xrm");
ScriptObject page = (ScriptObject)xrm.GetProperty("Page");
ScriptObject pageContext = (ScriptObject)page.GetProperty("context");
serverUrl = (string)pageContext.Invoke("getServerUrl");