2

我们构建了一个 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 方法。有人知道我们做错了什么吗?

4

2 回答 2

1

我认为您做错了什么是 :Invoke("addOnSave"... Invoke 的第一个参数是 JavaScript 函数。据我所知,您的 addOnSave 是 C#。

您可以简单地在 MainPage 上使用保存单击 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()
    {
        ...
    }
于 2011-05-06T22:57:42.343 回答
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;
    }

另外,请注意:要调用的函数不需要是可编写脚本的成员。

于 2011-06-06T08:01:15.033 回答