Caution
Az SQL tranzakció csak a RecroGridETEntity alaposztályból származtatott osztályok esetén indul automatikusan, egyébként egyénileg kell kezelni, illetve ez igaz a RecroTrack használatára is, ami az eltérő paraméterekből is látszik.
Ez a fejezet a RecroGrid Framework-ben megvalósított adatmódosítási funkciókat mutatja be. Az adatok szerkeszthetőség két alapvető tényezőtől függ, az aktuális jogosultsági szinttől, illetve a mező típusától. Az alapszintű jogosultsági rendszer mellett javasolt a RecroSec teljes körű felhasználókhoz és csoportokhoz köthető, paraméterezhető jogosultsági rendszer használata is.
Az adatok felvitele és módosítása a List nézetből a Toolbar-on elhelyezett gombok, vagy context-menü segítségével megjelenített Form nézetben lehetséges. Ez funkció külön kódírás nélkül is működik, de általában szükséges további testreszabás a felhasználói élmény fokozásához, illetve a felhasználó számára nem látható egyéb műveletek elvégzésére. Ezek a feladatok tipikusan a mezők alapértékének megadása, adatfüggő mezők kitöltése. A felhasználó számára kényelmes rögzítési felület, típusfüggő mezők, más listákból választás, továbbá a felhasználó által megadott adatok ellenőrzése, esetleges hibaüzenetek definiálása. A RecroGrid Framework számos belépési pontot támogat, hogy ezeket a feladatokat a leghatékonyabban lehessen megvalósítani.
This topic contains the following sections:
A belépési pontokat három fő csoportra bontjuk
Adatosztály interface kiterjesztések
Az eseményekről (inicializálás, új felvitel, módosítás, törlés) az entitás interface segítségével értesül. A megkapott információk alapján módosításokat hajthat végre önmagán, illetve üzenetet adhat vissza, amivel befolyásolhatja a további működést. Azokat a inicializálási és ellenőrzési feladatokat javasolt így megvalósítani, amik nem függnek más entitásoktól vagy egyéb külső adatoktól. Ha az entitás több RecroGrid alapja, akkor az egységes műveleteket itt érdemes megvalósítani.
public partial class Person : IRecroGridInitNew, IRecroGridUpdate, IRecroGridDelete
{
public bool RecroGridDelete(IRGDataContext context, RGClientParam arg, RGUIMessages messages)
{
if (Locked)
{
messages.AddError("The record is locked!");
return false;
}
return true;
}
public void RecroGridInitNew(IRGDataContext context, RGClientParam arg)
{
PersonType = "SC";
}
public bool RecroGridUpdate(IRGDataContext context, RGClientParam arg, RGUIMessages messages)
{
if (string.IsNullOrEmpty(FirstName))
{
//Error message associated with a field from the RecroDict dictionary
messages.AddError(RecroDict.Get(arg.HttpContext, "Person.Validation", "FirstName"), RecroGrid.Alias2ClientName(arg.RGProperties, "FirstName"));
}
if (string.IsNullOrEmpty(LastName))
{
messages.AddError(RecroDict.Get(arg.HttpContext, "Person.Validation", "LastName"), RecroGrid.Alias2ClientName(arg.RGProperties, "LastName"));
}
return messages.ErrorCount == 0;
}
}
Szerveroldali egyéni osztály
RecroGridDBCTEntity alaposztályból származó egyéni osztályban (az interface megvalósítástól eltérően), azokat az műveleteket javasolt elhelyezni, amik más entitástól vagy külső adatoktól függenek, illetve csak az adott RecroGrid működéséhez kellenek. Külső szervizek vagy modulok hívásának elhelyezése is itt javasolt.
Kliensoldali egyéni osztály
Kliensoldalon is javasolt ellenőrzéseket elhelyezni, amik a hibák nagyobb részét képesek kiszűrni, így növelhető az alkalmazás teljesítménye, de javasolt minden ellenőrzés szerveroldali megvalósítása is. Ide kerülhetnek az egyéni vizuális effektek, vagy biztonsági kockázatot nem jelentő (általában a felhasználó szempontjából kényelmi) ellenőrzési funkciók.
Szerveroldali megvalósítások
Egy adat új felvitelének folyamata a kliensoldalról indul, az entitás és a környezet meghatározásával, majd az alábbi szerveroldali folyamatok kerülnek végrehajtásra, illetve a felsorolt belépési pontokra van lehetőség:
Az OnInitNewRec(TEntity, RecroGridRGServiceParams) metódus segítségével az új entitás inicializálása van lehetőség. Paraméterben az új entitás és a kliensről érkező környezet kerül átadásra. Alapértelmezés szerint az entitás esetleges parent-hez kapcsolása, és ha az entitás megvalósította az IRecroGridInitNew interface-t, akkor a RecroGridInitNew(IRGDataContext, RGClientParam) metódusa is végrehajtásra kerül.
protected override void OnInitNewRec(ref Person newRec, RGServiceParams arg)
{
//Invoke IRecroGridInitNew
base.OnInitNewRec(ref newRec, arg);
}
Az inicializált új entitás és az aktuális RecroGrid-hez tartozó template alapján elkészül a HTML kimenet, amit a kliens megjelenít a felhasználónak szerkesztésre. Miután felhasználó jóváhagyja új felvitelét a kliensoldali ellenőrzéseket követően a rendszer visszaküldi a rögzített adatokat szerveroldalra.
Szerveroldalon ismételten lefut az OnInitNewRec(TEntity, RecroGridRGServiceParams) metódus, és ha a jogosultságok az új felvitelt lehetővé teszik, akkor elindul egy SQL tranzakció és az OnDataExchangeAsync(UTP, DictionaryString, Object, RGUIMessages) metódus feltölti a rekordot a kliensről kapott adatokkal.
protected override async Task OnDataExchangeAsync(Person dataRec, RgfDynamicDictionary clientData, RGUIMessages messages)
{
//Set the dataRec with the data received from the client
await base.OnDataExchangeAsync(dataRec, clientData, messages);
object data;
if (clientData.TryGetValue("MyCustomValue", out data))
{
//Custom data received from the client side.
}
}
OnUpdateRecAsync(RecroTrack, TEntity, RGClientParam, RGUIMessages) virtuális metódus felülírásával szerveroldali ellenőrzések és egyéni adatmódosítások hajthatók végre. Alapértelmezés szerint ha az entitás megvalósította az IRecroGridUpdate interface-t, akkor a RecroGridUpdate(IRGDataContext, RGClientParam, RGUIMessages) metódusa is végrehajtásra kerül. A szerveroldali ellenőrzéseket itt javasolt elvégezni, az esetleges hibaüzeneteket mezőkhöz kapcsolva vissza lehet adni. Ha a visszatérési érték True, akkor a tranzakció jóváhagyásra kerül, az esetleges figyelmeztető üzenetek megjelenítésre kerülnek, ellenkező esetben a tranzakció visszavonásra kerül és megjelennek a hibaüzenetek.
protected override async Task<bool> OnUpdateRecAsync(RecroTrack tracking, Person dataRec, RGClientParam arg, RGUIMessages messages)
{
if (arg.IsNewEntity)
{
//New data entry with custom modifications
}
else
{
//Modify data entry with custom modifications
}
//Invoke IRecroGridUpdate
if (!await base.OnUpdateRecAsync(tracking, dataRec, arg, messages))
{
return false;
}
if (string.IsNullOrEmpty(dataRec.FirstName))
{
//Error message associated with a field from the RecroDict dictionary
messages.AddError(RecroDict.Get(RecroGridContext.HttpContext, "Person.Validation", "FirstName"), Alias2ClientName("FirstName"));
}
if (!ExternalValidation(dataRec))
{
messages.AddError("Custom error message!");
}
return messages.ErrorCount == 0;
}
A módosítás folyamata az új felviteltől két ponton tér el. Módosítás esetén az OnInitNewRec metódus nem kerül meghívásra, illetve a kulcs módosítása esetén az SQL tranzakció indítását követően a kulcs direkt SQL update segítségével módosításra kerül.
Törlés esetén az OnDeleteRecAsync(RecroTrack, TEntity, RGClientParam, RGUIMessages) metódus kerül végrehajtásra, ami alapértelmezés szerint, ha az entitás megvalósította az IRecroGridDelete interface-t, akkor a RecroGridDelete(IRGDataContext, RGClientParam, RGUIMessages) metódusa is végrehajtásra kerül. Kliensoldalon a felhasználó számára figyelmeztető üzenet jelenik meg. A rekord könnyebb azonosítására az RGO_FriendlyKey opciós paraméterben azon mezők ClientName azonosítóját lehet felsorolni, amik értékei az üzenetben megjelennek.
Ellenőrzéseket javasolt már kliensoldalon is elhelyezni, amiben a kliensoldali osztály létrehozása nélkül, a következő opciós paraméterek segítenek.
RGO_Nullable opciós beállításban false paraméter esetén a mezőt kötelező kitölteni, ellenkező esetben a \NULL megadásával lehet null értéket beállítani.
RGO_MaxLength opciós paraméter meghatározza egy karakteres mező maximális hosszát a kliensoldali bevitel esetén.
RGO_JSValidator opciós beállításban egy kliensoldali JavaScript ellenőrzést lehet végrehajtani. A függvény egy args nevű paramétert kap, ami tartalmaz egy ClientRec tömböt az adatrögzítés során elérhető összes mező definíciójával és értékével. Az egyes mezőkre a ClientName használatával lehet hivatkozni, ami megadja a RecroGridColumnDefs adatokat és a Value-ban az oszlop értékét. Az aktuális mező értéke közvetlenül az args.Value-ból is kinyerhető. Hiba esetén a visszatérési érték false az args.Error-ban pedig a hibaüzenetet lehet megadni.
RGO_NoKeyUpdate opciós paraméter beállításával letiltható a kulcs módosítása.
//Value validation using RegExp
var patt = new RegExp('^[\$0-9a-zA-Z]+$');
if (!patt.test(args.Value)) {
args.Error = 'The field value can only contain letters and numbers!';
return false;
}
//Dependency on another field
if (args.Value < args.ClientRec['rg-col-112'].Value) {
//args.Error = get_RecroDictStr('Scope', 'Id'); //Message from the RecroDict dictionary.
args.Error = 'The Value cannot be less than XY!';
return false;
}
//
A szerveroldali ellenőrzések az előző szekcióban bemutatott interfészek és virtuális metódusok használatával végezhető. A RGUIMessages paraméterben hiba és figyelmeztető üzeneteket lehet megadni, ami kliensoldalon a adott mezőhöz kapcsoltan megjelenik.