fredag 2 november 2007

Visa postade XForms formulär utan editeringsmöjlighet

I bland är det önskvärt att kunna visa innehållet i ett postat formulär för användaren som postade det utan att ge användare möjlighet att redigera postad data.

Det första att göra är att skapa en instans av det aktuella formuläret med metoden XForm.CreateInstance. Om id för postad data är känt kan det skickas som argument med CreateInstance, annars går det att använda GetPostedData på det skapade XForms objektet för att hämta en lista med postade dataobjekt. Loopa igenom listan och plocka ut användarens data. Slutligen sätts formulärets data genom att tilldela dataobjektet till FormControl.Data.

När nu formuläret renderas är alla fält ifyllda med användarens postade data. Men formuläret är editerbart. För att undvika att användaren postar om formuläret behöver fälten låsas och eventuella submit-knappar tas bort.


Börja med att lägga till en event hanterare i OnLoad för kontrollen/sidan.

FormControl.ControlsCreated += new EventHandler(FormControl_ControlsCreated); }

Skapa en delegat som hanterar eventet:

void FormControl_ControlsCreated(object sender, EventArgs e) {

foreach (System.Web.UI.Control var in FormControl.Controls) {
if (var.GetType().Equals(typeof(XForms.WebControls.TextArea)))
((XForms.WebControls.TextArea)var).Attributes.Add("readonly", "readonly");
if (var.GetType().Equals(typeof(XForms.WebControls.Input)))

((XForms.WebControls.Input)var).Attributes.Add("readonly", "readonly");
if (var.GetType().Equals(typeof(XForms.WebControls.Submit)))
// logik för att ta bort en kontroll säkert
}
}

Nyckeln till att låsa fälten att lägga till ett attribut som inkluderas i renderingen av kontrollen.

Det går också att plocka ut input-kontroller ur ett XForms-formulär med

System.Collections.ArrayList al = FormControl.ExtractXFormControls();

Den här informationen finns på EPiServers hemsida men jag rekommenderar även användandet av Reflector för att se hur saker och ting sköts under skalet i EPiServer.

Inga kommentarer: