5 Stimmen

Asp.net-Schaltflächenobjekt - Runat-Server-Problem

Ich habe ein kleines Problem mit der Erstellung einer Schaltfläche auf der Server-Seite Code. Ich verwende Stringbuilder, um eine Tabelle in HTML zu erstellen, und ich möchte ein neues Button-Objekt erstellen und es an mein Stringbuilder-Objekt übergeben. Das Problem, das ich habe, ist, dass meine Seite nicht kompiliert wird, wenn ich debugge. Ich möchte meinem Button-Objekt eine runat="server"-Eigenschaft geben, aber ich weiß nicht, wie das geht.

Button add_img_popup = new Button();
            add_img_popup.Text = "Add new Image"; // text
            add_img_popup.Click += new EventHandler(addImgPopup_Click); // click event handler
            add_img_popup.Enabled = true;
            add_img_popup.ID = "btn_add_img_popup"; // programmatic id

            Page.Controls.Add(add_img_popup); // add to page controls so it renders

            st.Append("<tr>");
            st.Append("<td>");
            st.Append(add_img_popup); // pass to string builder
            st.Append("</tbody>");
            st.Append("</table>");

Und die Nachricht, die der Server mir gibt.


Serverfehler in der Anwendung '/'.

Das Steuerelement 'btn_add_img_popup' vom Typ 'Button' muss innerhalb eines Formular-Tags mit runat=server platziert werden. Beschreibung: Während der Ausführung der aktuellen Webanfrage ist eine unbehandelte Ausnahme aufgetreten. Bitte überprüfen Sie den Stack-Trace, um weitere Informationen über den Fehler und seine Ursache im Code zu erhalten.

Details zur Ausnahme: System.Web.HttpException: Das Steuerelement 'btn_add_img_popup' vom Typ 'Button' muss innerhalb eines Formular-Tags mit runat=server platziert werden.

Fehlerquelle:

Während der Ausführung der aktuellen Webanfrage wurde eine unbehandelte Ausnahme erzeugt. Informationen über den Ursprung und den Ort der Ausnahme können anhand der nachstehenden Stapelverfolgung der Ausnahme ermittelt werden.

Stack Trace:

[HttpException (0x80004005): Das Steuerelement 'btn_add_img_popup' vom Typ 'Button' muss innerhalb eines Formular-Tags mit runat=server platziert werden]. System.Web.UI.Page.VerifyRenderingInServerForm(Control control) +8702387 System.Web.UI.WebControls.Button.AddAttributesToRender(HtmlTextWriter writer) +54 System.Web.UI.WebControls.WebControl.RenderBeginTag(HtmlTextWriter writer) +20 System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) +20 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +99 System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +134 System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +19 System.Web.UI.Page.Render(HtmlTextWriter writer) +29 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +99 System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1266

5voto

Mun Punkte 13868

Es sieht so aus, als hätten Sie hier ein paar Probleme:

Fehlendes Formular-Tag

Vergewissern Sie sich, dass Ihre Seite ein Formular-Tag mit der Angabe "runat=server" enthält.

<form id="form1" runat="server">
    <asp:PlaceHolder ID="ph1" runat="server"/>
</form>

Code Behind:

// Create the button control
Button add_img_popup = new Button();
add_img_popup.Text = "Add new Image";

// Add it the placeholder
// (which is inside the form)
ph1.Controls.Add(add_img_popup);

Schaltfläche wird dem Stringbuilder hinzugefügt

Das Hinzufügen eines Steuerelements zu einem Stringbuilder bewirkt nicht, dass es gerendert wird. Sie müssen das Steuerelement zuerst in eine Zeichenfolge rendern, indem Sie etwas wie dieses verwenden:

public string RenderControl(Control ctrl) 
{
    StringBuilder sb = new StringBuilder();
    StringWriter tw = new StringWriter(sb);
    HtmlTextWriter hw = new HtmlTextWriter(tw);

    ctrl.RenderControl(hw);
    return sb.ToString();
}

Sie können die RenderControl-Methode wie folgt verwenden:

st.Append("<tr>");
st.Append("<td>");
st.Append(RenderControl(add_img_popup));
st.Append("</tbody>");
st.Append("</table>");

Obwohl dadurch das Steuerelement gerendert wird, können Sie einige Probleme bei der Handhabung des Postback-Ereignisses (addImgPopup_Click) haben, da das Steuerelement bei jedem Laden der Seite neu erstellt werden muss.

Warum müssen Sie das Steuerelement zum StringBuilder hinzufügen, anstatt das Steuerelement direkt auf der Seite zu platzieren? In der Regel gibt es bessere Möglichkeiten, ein Ziel mithilfe vorhandener ASP.NET-Steuerelemente zu erreichen, als etwas zuerst in einen String zu rendern.

3voto

Davide Piras Punkte 42970

Tun Sie dies nicht:

Page.Controls.Add(add_img_popup);

haben ein Div mit runat=server in Ihrer Seite innerhalb des Form-Tags und wenn das div heißt myDiv dann tun Sie dies:

myDiv.Controls.Add(add_img_popup);

0voto

Christian Punkte 3438

Es gibt noch eine andere Möglichkeit, dies zu tun...

Setzen Sie eine <asp:button auf der Seite, erstellen Sie ein Klick-Ereignis dafür und markieren Sie es dann als ausgeblendet. Dann, wenn Sie Ihre Tabelle erstellen, müssen Sie nur in einer normalen HTML-Schaltfläche mit einem OnClick-Ereignis Code, um die Schaltflächen Callback auslösen...

0voto

Amir978 Punkte 795

Wie der Fehler sagt, müssen Sie Ihre Schaltfläche in ein Tag setzen. so einfach fügen Sie es zu Ihrem Stream.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X