我们已经构建了一个silverlight网格,允许从主要实体形式编辑子实体。像冠军一样工作。但是我们必须在silverlight控件上有一个单独的保存按钮,以便将更新推送回CRM。我们想要做的是允许CRM表单调用silverlight控件上的方法来提醒我们表单正在保存,然后同时将数据保存在silverlight表单中。但它只是不起作用。到目前为止我们尝试过的是:
在Silverlight控件中我们有一个公共类:
[ScriptableType]
public class JSModel
{
[ScriptableMember]
public void Save()
{
if (OnSave != null)
{
OnSave(this, new EventArgs());
}
}
public event EventHandler OnSave;
public JSModel()
{
HtmlPage.RegisterScriptableObject("JSModel", this);
HtmlPage.Window.Eval(
@"
function CallSLSave()
{var sl = Xrm.Page.ui.controls.get('" + HtmlPage.Plugin.TagName + @"');
sl.content.JSModel.Save();} ");
ScriptObject xrm = (ScriptObject)HtmlPage.Window.GetProperty("Xrm");
ScriptObject Page = (ScriptObject)xrm.GetProperty("Page");
ScriptObject data = (ScriptObject)Page.GetProperty("data");
ScriptObject entity = (ScriptObject)data.GetProperty("entity");
entity.Invoke("addOnSave", new object[] { "CallSLSave" });
}
}
但它并没有调用javascript方法。任何人都有任何想法,我们做错了什么?
答案 0 :(得分:1)
我认为你做错了是:Invoke(“addOnSave”...... Invoke的第一个参数是JavaScript函数。当我收集你的addOnSave是C#。
您可以在MainPage上使用Save单击EventHandler。
在MainPage.cs中:
[ScriptableMember]
private void Save(object sender, RoutedEventArgs e)
{
HtmlPage.RegisterScriptableObject("scriptableControl", this);
HtmlPage.Window.Eval(@"function CallSLSave()
{ var sl = document.getElementById('silverlightControl'); sl.Content.scriptableControl.addOnSave();}");
HtmlPage.Window.Invoke("CallSLSave");
//or the way you do except for entity.Invoke("addOnSave" should be entity.Invoke("CallSLSave");
}
[ScriptableMember]
public void addOnSave()
{
...
}
答案 1 :(得分:1)
由于HTML桥接的神奇之处,您可以使用委托作为addOnSave方法的参数。不需要Javascript引导函数或页面上的可编写脚本的对象。这简化了解决方案:
void SetupHook()
{
var xrm = (ScriptObject)HtmlPage.Window.GetProperty("Xrm");
var page = (ScriptObject)xrm.GetProperty("Page");
var data = (ScriptObject)page.GetProperty("data");
var entity = (ScriptObject)data.GetProperty("entity");
entity.Invoke("addOnSave", new Func<bool>(SaveHook));
}
private bool SaveHook()
{
// ... Do save stuff here ...
return true;
}
另外,请注意:要调用的函数不需要是可编写脚本的成员。