如何通过Silverlight上的CRM2011上的javascript挂钩到save方法

时间:2011-05-06 16:34:37

标签: javascript silverlight dynamics-crm-2011

我们已经构建了一个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方法。任何人都有任何想法,我们做错了什么?

2 个答案:

答案 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;
    }

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