SharePoint: How to pass parameters into a Modal Dialog Window and then access them
Passing parameters into a Modal Dialog Window
Opening a web page in a Modal Dialog Window we can pass parameters to it through the args property of dialog options. A typical JavaScript might look like
function OpenDialog() { var opt = { url : 'somePage.aspx', autoSize: true, /* additional parameters */ args: { arg1: 'The second argument is ', arg2: 12345 }, dialogReturnValueCallback: function (res, retVal) { if (res === SP.UI.DialogResult.OK) { /* do something */ } else { /* do something else */ } } }; SP.UI.ModalDialog.showModalDialog(opt); }
Now let’s take a look how these parameters can be accessed from within the Parent-page and the page opened in the dialog.
Accessing the arguments from within the page opened in the dialog
In general case, when opening a SharePoint-based page, the passed arguments could be reached using a script similar to the following:
function DoSomethingWithArgs() { var passedArgs = SP.UI.ModalDialog.get_childDialog().get_args(); /* get access to the passed parameters */ alert(passedArgs.arg1 + passedArgs.arg2); }
The key method here is SP.UI.ModalDialog.get_childDialog, which allows to get the current dialog, or, to be more precise, the current SP.UI.Dialog object. The retrieved object, in turn, exposes the get_args method to access the passed parameters.
A possible use of the DoSomethingWithArgs function from the sample above is
<a href="#" onclick="ExecuteOrDelayUntilScriptLoaded(DoSomethingWithArgs, 'sp.ui.dialog.js'); return false;"> Show me the passed arguments </a>
In case the web page opened in the dialog knows nothing about SharePoint and doesn’t include appropriate SharePoint JavaScript files, use the following version of the code:
function DoSomethingWithArgs() { var passedArgs = window.frameElement.dialogArgs; /* get access to the passed parameters */ alert(passedArgs.arg1 + passedArgs.arg2); }
Where the dialogArgs as a property of the window.frameElement object is provided by SP Dialog framework and returns the passed arguments.
Assuming the SharePoint‘s ExecuteOrDelayUntilScriptLoaded function isn’t available as well, the possible use of the DoSomethingWithArgs is quite straightforward:
<a href="#" onclick="DoSomethingWithArgs(); return false;"> Show me the passed arguments </a>
All other conditions being equal, I recommend the approach with the window.frameElement object as it works always and doesn’t require the page in the dialog to be bound to SharePoint somehow.
Accessing the passed arguments from within the Parent-page
The Parent-page is a place where we define parameters and pass them to the dialog. So, the most direct way is to store the required values into some variable(s) to access them later. Another way is to rely on Dialog framework and use the code already mentioned in the previous section, namely
//... var passedArgs = SP.UI.ModalDialog.get_childDialog().get_args(); //...
The more interesting case, however, is to access the passed arguments inside the dialogReturnValueCallback function. The listing below contains an example of one of such dialogReturnValueCallback definitions:
function OpenDialog() { var opt = { url : 'somePage.aspx', autoSize: true, /* additional parameters */ args: { arg1: 'The second argument is ', arg2: 12345 }, dialogReturnValueCallback: function (res, retVal) { if (res === SP.UI.DialogResult.OK) { var passedArgs = this.get_args(); /* get access to the passed parameters */ alert(passedArgs.arg1 + passedArgs.arg2); } } }; SP.UI.ModalDialog.showModalDialog(opt); }
The dialogReturnValueCallback function will be called in the context of the SP.UI.Dialog object associated with the current Modal Dialog Window. Therefore, inside the function the passed arguments can be accessed using this-keyword.
A possible use of the OpenDialog is shown below:
<a href="#" onclick="ExecuteOrDelayUntilScriptLoaded(OpenDialog, 'sp.ui.dialog.js'); return false;"> Open Modal Dialog Window </a>
ps There is a quite detailed article about dealing with Dialogs in SharePoint 2010. So, read to learn more about Dialog framework.