17 Stimmen

asp.net 4.0: Gibt es eine Entsprechung von ClientIDMode für die Namen von INPUTs?

Ich habe eine asp:ListView deren ClientIDMode auf Predictable gesetzt ist. Sein ItemTemplate enthält ein asp:textbox .

Die ID des Textfelds verhält sich so, wie ich es erwarte, aber seine name verwendet immer noch einen Algorithmus, der an die AutoID erinnert:

<input name="lvFields$ctrl0$tbVal" id="lvFields_tbVal_somekey" type="text"/>

Gibt es eine Möglichkeit, den Namen der Eingabe so zu gestalten, dass er sich wie die ID verhält?

(Bearbeitung als Antwort auf die Fragen unten:)

El Name des Eingabeelements ist das, was in den POST-Daten steht. Wenn also ein Postback die Liste ändert, an die die ListView gebunden ist (z. B. durch den Austausch von zwei Elementen), werden die Werte aus den Textfeldern mit den falschen Schlüsseln verknüpft, weil das Framework sie auf der Grundlage des Name und nicht die ID .

2voto

mattmanser Punkte 5561

Sie können den Namen eines Inputs ändern, indem Sie die Methode aus dem folgenden Beitrag verwenden, sie aber leicht abändern:

Wie entfernt man das Attribut "Name" von Server-Steuerelementen?

Ich habe mich über die RenderChildren Methode auf eine Page Kontrolle, da ich nur für einige wenige Steuerelemente die volle Kontrolle über den HTML-Code haben wollte:

protected override void RenderChildren(HtmlTextWriter writer)
{
    var unScrewNamesRender = new RenderBasicNameHtmlTextWriter(writer);
    base.RenderChildren(unScrewNamesRender);
}

private class RenderBasicNameHtmlTextWriter : HtmlTextWriter
{
    public RenderBasicNameHtmlTextWriter(TextWriter writer) : base(writer) { }

    public override void AddAttribute(HtmlTextWriterAttribute key, string value)
    {
        if (key == HtmlTextWriterAttribute.Name && value.Contains("POLine"))
        {
            value = value.Substring(value.LastIndexOf("$") + 1);
        }

        base.AddAttribute(key, value);
    }
}

Sie müssen wissen, was Sie tun, wenn Sie dies versuchen, wird WebForms denken, das Steuerelement fehlt, so dass Sie es nicht in allen Postbacks verwenden können. Für meine Zwecke, wo ich wollte, um eine beliebige Anzahl von mehreren Zeilen entweder Server-oder Client-Seite, ohne sich mit .Net Ajax-Steuerelemente hinzufügen, funktioniert es gut.

1voto

Rich Dudley Punkte 21

Ich bin mir ziemlich sicher, dass Sie den Namen nicht ändern können, insbesondere wenn Sie den ClientIDMode ändern. Als Alternative können Sie ein Title-Attribut hinzufügen. VS wird dies im serverseitigen Code als unbekannt kennzeichnen, aber es wird im HTML korrekt wiedergegeben. Wenn Sie einige clientseitige Manipulationen vornehmen, können Sie die Eingabe als solche ansprechen:

<script type="text/javascript">
$(document).ready(function () {
$('input:text[title="TextBoxName"]').datepicker();
});
</script>

0voto

matk Punkte 1518

Soweit ich weiß, gibt es keine Möglichkeit, den Namen des Eingabeelements zu ändern. Der Name entspricht der Eigenschaft UniqueID, die vom System generiert wird und auf die Sie keinen Einfluss haben. Es scheint, dass Sie einen Weg finden müssen, um das zu erreichen, was Sie wollen, indem Sie nur die ID des Steuerelements verwenden.

0voto

Brian Mains Punkte 50145

Beide Namen verwenden das vorhersehbare Muster; ursprünglich war der Name auch gleich ct100_ct100 usw. Soweit ich das sehe, ist das ein vorhersehbarer Name. Der Client-ID-Wert verwendet immer _ zwischen Kontrollpräfixen und die eindeutige ID (Namensattribut) verwendet immer $. Die beiden werden immer übereinstimmen, außer für ein paar Steuerelemente, die Name für etwas (radiobuttonlist verwendet für die Gruppierung) zu nutzen.

HTH.

0voto

Guru Kara Punkte 5906

Ich hatte genau das gleiche Problem einmal und musste eine dieser Eigenschaften, die in "System.Web.UI.Control" ausgesetzt sind, verwenden, um clientseitige Steuerelementnamen auf der Serverseite zu erhalten.

Spielen Sie mit diesen Eigenschaften herum und konstruieren Sie den "Namen" auf der Serverseite selbst und verwenden Sie Request.Form("NameHere")

Me.ClientIDSeparator
Me.IdSeparator
Me.UniqueID

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