Gus
Gus

Reputation: 896

Execute html from database in ASP.NET page

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

Answers (2)

competent_tech
competent_tech

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

sq33G
sq33G

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

Related Questions