Sending Ajax requests to ELMA server
It is often necessary to work with data, which users enter when filling in forms or sending messages. Scripts when loading/editing form field values partially solve this problem, however, their functionality is limited, if, for example, you need to handle system properties of objects or perform complex actions, such as starting a business process.
Ajax requests are a powerful tool, which can deal with collecting required data from a form, sending them to the ELMA server, process them and send the resulting data back to the form.
This article illustrates several examples of using Ajax requests.
Example 1. The end date on the task creation form has to be the start date + two business days.
To do so, you have to edit the file TaskEditor.cshtml, located in the folder ELMA3-Standart(Express)\Web\Modules\EleWise.ELMA.BPM.Web.Tasks\Views\Task, as follows.
First, disable the execution of standard Javascript functions, triggered by changing the start date. For this, comment out this string:
elma.SetDateTimeDependenceInputs(’@(Html.IDFor(m => m.StartDate))’, ’@(Html.IDFor(m => m.EndDate))’);
After that, add the following Javascript, which will be triggered when changing the start date:
<script type="text/javascript">
$(document).ready(function () { //instruction to the server, that the script has to be executed
After the form is loaded
$(’#StartDate’).bind(’change’, function () { // set the function as an event handler
When changing the start date value
var dat = $(’#StartDate’).val().toString(); // get the currently set start date value
$.ajax( { // create a new Ajax request
traditional: true, // since simple data is being conveyed
(string, in this case), disable “thorough” transformation.
To learn more about data transformation, follow this link (http://jquery.page2page.ru/index.php5/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%B2_url)
url: "@(Url.Action("GetEndDate", "TaskExt", new {area = "EleWise.ELMA.TasksExtension.Web" }))",
// specify the address to send the request to –
In this case, the GetEndDate() method
of TaskExtController, located in the web module (EleWise.ELMA.TasksExtension.Web) will be invoked
data: "StartDate=" + dat, // define the data to transfer in the request body
dataType: "json", // specify the type of the data to transfer
type: "POST", // specify the request type
success: function(data) // define the data handler function,
which will return the controller method, in case of successful execution
{
$(’#EndDate_date’).attr("value", data);
// the GetEndDate method returns the string, which contains the date as dd.mm.yy;
write it to the end date
}
});
});
});
</script>
The GetEndDate() method is defined in the web module (EleWise.ELMA.TasksExtension.Web). To learn more about creating a web module, see the following articles: <!--(http://www.elma-bpm.ru/kb/article-97.html) and (http://www.elma-bpm.ru/kb/article-107.html)-->.
public ActionResult GetEndDate(string StartDate)
// declaration of the method and conveyed parameters
{
var date = DateTime.Parse(StartDate); // parse the date from string to DateTime
if (date != null) // if parsing is successful
{
var calendar = Locator.GetServiceNotNull<EleWise.ELMA.Scheduling.IProductionCalendarService>();
// load the business calendar
DateTime endDate = calendar.EvalTargetTime(date, new TimeSpan(2, 0, 0, 0));
// add two days to the start date
return Json(endDate.ToShortDateString()); // convert the date to the required format (dd.mm.yy),
serialize (convert to json) and return to the view
}
else // if there is error while converting
return Json(DateTime.Now.ToShortDateString()); // return the current date to the view
}
Example 2. You can pass data that are more complex to an Ajax request as follows:
<script type="text/javascript">
$(document).ready(function () {
//instructions to the server, that the script has to be executed after the form is loaded
$(’#CommentActionModel_DocumentAttachments_Document_Id’).bind(’valueChange’, function () {
// set the function as an event handler ,
when adding a new document to the list of attachments
var dat = $(’#StartDate’).val(); // get the current value of the start date
var arr = []; // initialize array
arr[’date’] = dat; // write the received start date value to the array
var docIds = $(’#div-CommentActionModel_DocumentAttachments_Document_Id’).find(’input’);
// get IDs of documents, attached to the task and write them to the docIds array
var i = 0;
if (docIds.length) { // if the array contains elements
for (i = 0; i < docIds.length; i++) {
arr[’docIds[’ + i.toString() + ’]’] = docIds[i].value;
// consequently write them to the array as arr[’docIds[i]’] = value
}
arr[’docIds[’ + (i+1).toString() + ’]’] = this.value;
// write the last added element to the end of the array
}
else { // if no other documents were added
arr[’docIds[0]’] = this.value; // write the ID of the added document to the array
}
$.ajax( { // create a new ajax request
url: "@(Url.Action("GetEndDate", "TaskExt", new { area = "EleWise.ELMA.TasksExtension.Web" }))",
// specify the address to send the request to.
In this case, the GetEndDate() method of TaskExtController, located in the web module
(EleWise.ELMA.TasksExtension.Web), will be invoked
data: $.extend({ }, arr), // define the data to transfer in the request body
dataType: "json", // specify the type of the data to transfer
type: "POST", // specify the request type
success: function(data) // define the data handler function,
which will return the controller method, in case of successful execution
{
var jsonData = JSON.stringify(data);
// convert the data, returned by the controller to a json string
var newArr = JSON.parse(jsonData); // parse the string – convert it to a regular array
if (newArr.length) { // if the array is not empty, process the elements
for (i = 0; i < newArr.length; i++) {
// process array element
}
}
}
});
});
});
</script>
In this case, the code of the controller method is as follows:
public ActionResult GetEndDate(Nullable<DateTime> date, long[] docIds)
// declaration of the method and conveyed parameters;
the date is converted to the required type by the controller,
and the document IDs array is converted to a long-type enumeration
{
// here data can be processed in the necessary way,
to test it, add a part of received data to the list and return it back to the form
List<string> output = new List<string>(); // initialize the list
output.Add(date.Value.ToString()); // write elements
output.Add(docIds.ElementAt(0).ToString());
return Json(output); // convert the list to json and return it to the form
}
You can download examples of Ajax requests here: http://dl.elma-bpm.ru/Primery.zip