Advanced custom page code sample
You can develop a unique UI for your applications by creating custom pages. This advanced sample code illustrates how to create a custom page by using the Model-View-Controller (MVC) architectural pattern. The implementation of this custom page uses MVC 4 ASP.NET. It includes files for the data domain, business logic, and the UI elements.
This page contains the following information:
Model code sample
The code sample for the model includes objects representing your data.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace PatientTracker.CustomPages.Models
{
public class PatientModel
{
public Int32 PatientArtifactID { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public DateTime DateOfBirth { get; set; }
public String PatientNotes { get; set; }
public String PicturePath { get; set; }
}
}
View code sample
The code sample for the view includes elements that appear in the UI.
@model PatientTracker.CustomPages.Models.PatientModel
@{
ViewBag.Title = "Patient";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Patient Profile</h2>
<fieldset>
<legend>Patient</legend>
<img src="@Model.PicturePath" style="margin-top:15px;margin-bottom:15px;border:5px solid #5A9BC7;display:block;" />
<div class="display-label">
First Name:
</div>
<div class="display-field">
@Html.DisplayFor(model => model.FirstName)
</div>
<div class="display-label">
Last Name:
</div>
<div class="display-field">
@Html.DisplayFor(model => model.LastName)
</div>
<div class="display-label">
Date of Birth:
</div>
<div class="display-field">
@Html.DisplayFor(model => model.DateOfBirth)
</div>
<div class="display-label">
Notes:
</div>
<div class="display-field">
@Html.DisplayFor(model => model.PatientNotes)
</div>
</fieldset>
Controller code sample
The code sample for the controller includes the business logic for retrieving and displaying data.
Note: For more information about using helpers to connect to the Services API, see Connect to the Services API with the client-side proxy and Using Relativity API Helpers.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace PatientTracker.CustomPages.Controllers
{
/// <summary>
/// This custom page shows how to use a patient artifactID and current workspace artifactID to retrieve information from the RSAPI, and then display a profile page for the patient.
/// </summary>
public class PatientController : Controller
{
public static readonly Guid PATIENT_RDO_GUID = new Guid("EDC3AF33-7D25-4897-8285-6E36EA1D4AAE");
public static readonly Guid FIRST_NAME_FIELD_GUID = new Guid("EB024552-3A1B-40C1-B4DC-5815C3DD3AD3");
public static readonly Guid LAST_NAME_FIELD_GUID = new Guid("DA73E11E-9D02-4D29-9D3C-F84E66223B2A");
public static readonly Guid GENDER_FIELD_GUID = new Guid("04E5F293-A4E1-4DF4-8816-F1E6645AE001");
public static readonly Guid DATE_OF_BIRTH_FIELD_GUID = new Guid("96BC22AF-F2F6-4C92-AD96-CF08BF9AAB4D");
public static readonly Guid PATIENT_NOTES_FIELD_GUID = new Guid("5702F31B-48AC-4E2A-9000-A48B3E3ABDBF");
public static readonly Guid PICTURE_FIELD_GUID = new Guid("006F21C0-66C8-46E0-94B2-EF37C6478C2D");
public ActionResult Index(Int32 patientArtifactID, Int32 workspaceArtifactID)
{
PatientTracker.CustomPages.Models.PatientModel patient = new Models.PatientModel();
kCura.Relativity.Client.DTOs.RDO patientRDO = null;
try
{
//Create an instance of the RSAPIClient so we can pull back information about the patient.
using (kCura.Relativity.Client.IRSAPIClient client = Relativity.CustomPages.ConnectionHelper.Helper().GetServicesManager().CreateProxy<kCura.Relativity.Client.IRSAPIClient>(Relativity.API.ExecutionIdentity.System))
{
//Set the workspace artifactID.
client.APIOptions.WorkspaceID = workspaceArtifactID;
//Create an instance of the RDO with the Patient RDO GUID and the patient artifactID.
patientRDO = new kCura.Relativity.Client.DTOs.RDO(patientArtifactID);
patientRDO.ArtifactTypeGuids.Add(PATIENT_RDO_GUID);
patientRDO.Fields = kCura.Relativity.Client.DTOs.FieldValue.AllFields;
//Get the patient RDO from the RSAPI.
patientRDO = client.Repositories.RDO.Read(patientRDO).Results[0].Artifact;
//Set properties on the patient model.
patient.FirstName = patientRDO.Fields.Where(x => x.Guids.Contains(FIRST_NAME_FIELD_GUID)).Single().ValueAsFixedLengthText;
patient.LastName = patientRDO.Fields.Where(x => x.Guids.Contains(LAST_NAME_FIELD_GUID)).Single().ValueAsFixedLengthText;
patient.DateOfBirth = patientRDO.Fields.Where(x => x.Guids.Contains(DATE_OF_BIRTH_FIELD_GUID)).Single().ValueAsDate.Value;
patient.PatientNotes = patientRDO.Fields.Where(x => x.Guids.Contains(PATIENT_NOTES_FIELD_GUID)).Single().ValueAsLongText;
//Construct a download request used to get a proper download url for the file to be downloaded.
kCura.Relativity.Client.DownloadURLRequest pictureFieldDownloadRequest = new kCura.Relativity.Client.DownloadURLRequest(client.APIOptions);
Uri currentUrl = Request.Url;
pictureFieldDownloadRequest.BaseURI = new Uri(String.Format("{0}://{1}/", currentUrl.Scheme, currentUrl.Host));
pictureFieldDownloadRequest.Target.FieldGuid = PICTURE_FIELD_GUID;
pictureFieldDownloadRequest.Target.ObjectArtifactId = patientArtifactID;
//Set the picture file path on the patient model.
patient.PicturePath = client.Repositories.RDO.GetFileFieldDownloadURL(pictureFieldDownloadRequest).URL;
}
}
catch (System.Exception ex)
{
patient.PatientNotes = "EXCEPTION: " + ex.ToString();
}
return View(patient);
}
}
}