Как подключиться к методу сохранения через JavaScript на CRM2011 от Silverlight - PullRequest
2 голосов
/ 06 мая 2011

Мы создали сетку Silverlight, которая позволяет редактировать дочерние объекты из формы основного объекта.Работает как чемпион.Но у нас должна быть отдельная кнопка сохранения на элементе управления Silverlight, чтобы отправить обновления обратно в CRM.Мы хотели бы, чтобы форма CRM вызывала метод элемента управления silverlight, чтобы предупредить нас о сохранении формы, а затем одновременно сохранить данные в форме silverlight.Но это просто не работает.До сих пор мы пробовали следующее:

В элементе управления Silverlight у нас есть публичный класс:


[ScriptableType]
    public class JSModel
    {
       [ScriptableMember]
       public void Save()
       {
           if (OnSave != null)
           {
               OnSave(this, new EventArgs());
           }
       }</p>

<pre><code>   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 ]

1 голос
/ 06 июня 2011

Благодаря магии 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;
    }

Кроме того, обратите внимание: Вызываемая функция не обязательно должна быть членом с возможностью сценариев.

1 голос
/ 07 мая 2011

Я думаю, что вы делаете неправильно: Invoke ("addOnSave" ... Первым аргументом Invoke является функция JavaScript. Насколько я понимаю, ваш addOnSave - C #.

Вы могли бы просто иметь обычную кнопку на главной странице с помощью Save click 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()
    {
        ...
    }
...