Reputation: 896
Any suggestions to load a html page saved in the database?
html:
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>xxx</title>
</head>
<body>
<form id="Form1" runat="server" method="post">
<ext:ResourceManager ID="ResourceManager1" runat="server" />
</form>
</body>
codebehind:
protected override void OnInit(EventArgs e)
{
this.IniciarFormulario();
using (ServicoECMClient proxy = new ServicoECMClient())
{
tipoDocumento = proxy.ObterTipoDocumento(int.Parse(tipoDocumentoID));
}
if (tipoDocumento == null)
{
throw new ApplicationException();
}
this.Page.Header.InnerHtml = tipoDocumento.estilo; //css
this.Page.Form.InnerHtml = tipoDocumento.form; // form
base.OnInit(e);
}
I can not retrieve the form values.
Look:
foreach (System.Web.UI.Control controle in this.Form1.Controls)
{
if (controle.GetType().Name == "HtmlInputText" || controle.GetType().Name == "HtmlInputSelect"
|| controle.GetType().Name == "HtmlInputRadio" || controle.GetType().Name == "HtmlInputTextCheckbox")
{
if (!string.IsNullOrEmpty(this.Request[controle.ClientID]))
{
documento_indice documentoIndice = new documento_indice();
documentoIndice.id_indice = int.Parse(controle.ClientID.Split('_')[1]);
documentoIndice.valor = this.Request[controle.ClientID];
documentoIndice.timestamp = DateTime.Now;
documentos_indices.Add(documentoIndice);
}
}
}
Controls is empty. => this.Form1.Controls
Any Suggestion?
There's another better way to do?
Thanks.
Upvotes: 1
Views: 2780
Reputation: 44941
The short answer is, yes you can get this functionality to work. We provide all of our customer-specific customizations in a manner similar to this.
The long answer is that it will require some restructuring of your application and HTML.
The easiest way that we found to implement this is through UserControls. The basic approach is:
1) Create your page content that is stored in the DB as a UserControl, i.e.
<%@ Control Language="vb" AutoEventWireup="false" %>
<input id="txtTest" type="text" runat="server" />
2) When you extract it from the DB, store it in a file on disk with an ascx extension (say content.ascx for now).
3) Modify your main page to add a div that runs at the server that the ascx will be loaded into:
<div id="divContent" runat="server">
</div>
4) In page init, load the control into the div and initialize it:
Dim oControl As Control
' Load a user control
oControl = Me.LoadControl("content.ascx")
If oControl IsNot Nothing Then
' Ensure viewstate is enabled
oControl.EnableViewState = True
' Set properties as required
oControl.ID = "ContentControl"
' Clear the existing control(s) from the content container
Me.divContent.Controls.Clear()
' And add the new one
Me.divContent.Controls.Add(oControl)
End If
5) Access the collection of controls contained in the div control.
Note that on a page postback the controls will not have content loaded into them until the page load event is fired due to the standard page lifecycle.
I have verified that codebehind is not required and this works correctly exactly as described above.
Upvotes: 2
Reputation: 3360
Unless you add the controls to the controls collection by hand (a tricky business) you're going to need to read your form values the old-fashioned way:
Request.Form["txtSomething"]
That means you can get the string values contained in your controls if you know their names, but not much else.
Upvotes: 1