Formview keinen Wert vorbei innerhalb „Runat = server“ row enthaltenen
-
19-09-2019 - |
Frage
Ich habe den folgenden Code in der EditItemTemplate meiner Formview:
<tr id="primaryGroupRow" runat="server">
<td class="Fieldname">Primary Group:</td>
<td><asp:DropDownList ID="iPrimaryGroupDropDownList" runat="server" DataSourceID="GroupDataSource" CssClass="PageText"
DataTextField="sGroupName" DataValueField="iGroupID" SelectedValue='<%# Bind("iPrimaryGroup") %>'></asp:DropDownList></td>
</tr>
Wenn ich die runat = „server“ für die Tabellenzeile entfernen, dann wird das iPrimaryGroup Feld 100% und an die Business-Logik-Schicht richtig gebunden. Jedoch im Fall des obigen Code wird mit einem Wert von Null übergeben.
Kann mir jemand sagen, warum das so ist und wie um es zu bekommen? Dies ist in einer Kontrolle, die diese Tabellenzeile zu verstecken braucht, basierend darauf, ob oder nicht ein Administrator oder ein normaler Benutzer ist es bearbeiten. dh: Einige Felder sind Admin beschreibbar nur, und ich möchte die Steuerelemente aus der Ansicht auszublenden, wenn der Benutzer nicht ein Admin ist
.Lösung 3
Es scheint, dass diese Funktionalität ist, aber das ist nicht genau bestätigt.
http: //weblogs.asp .net / rajbk / Archiv / 2009/08/03 / Formview-binding-gotcha.aspx
Wenn das Objekt Formview verwenden, wenn Sie eine verschachtelte Kontrolle haben, dann Zwei-Wege-Datenbindung nicht richtig zur Arbeit gehen. Sie können die Steuerelemente im Code zugreifen, und Sie können auf die Daten zu bekommen, aber es ist einfach nicht den Wert automatisch im Backend Ihrer Business Logic Layer (BLL) gehen zu aktualisieren, wie es soll.
Zum Glück gibt es eine Abhilfe. Die Art und Weise, um es arbeitet, ist ein Ereignis für ItemUpdating zu erstellen. Es wird eine Signatur wie folgt aussehen:
protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)
Das gibt Ihnen den Zugriff auf FormViewUpdateEventArgs, was wiederum ermöglicht es Ihnen, Änderungen an den Object Werte zu machen, während sie im Flug sind und bevor sie Ihren BLL-Code getroffen, wie folgt:
protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)
{
if (frmProfile.FindControl("iPrimaryGroupDropDownList") != null)
{
DropDownList iPrimaryGroupDropDownList = ((DropDownList)frmProfile.FindControl("iPrimaryGroupDropDownList"));
e.NewValues["iPrimaryGroup"] = iPrimaryGroupDropDownList.Text;
}
}
Andere Tipps
Wenn die Sicherheit ist ein Anliegen, vielleicht könnte dies besser funktionieren
<tr>
<td colspan='2'>
<asp:panel runat='server' visible='<%= IsUserAdmin %>'>
<table>
<tr>
<td class="Fieldname">Primary Group:</td>
<td><asp:DropDownList ID="iPrimaryGroupDropDownList" runat="server" DataSourceID="GroupDataSource" CssClass="PageText" DataTextField="sGroupName" DataValueField="iGroupID" SelectedValue='<%# Bind("iPrimaryGroup") %>'></asp:DropDownList>
</td>
</tr>
</table>
</asp:panel>
</td>
Wenn mich nicht alles täuscht jede Markup innerhalb der Platte nicht, wenn sichtbar = false gemacht werden
einen Schuss auf diesem:
Entfernen Sie die runat = server Attribut
Definieren Sie eine CSS-Klasse
.hidden{ display:hidden;}
Stellen Sie dann das Attribut Klasse basierend auf, ob der Benutzer ein Administrator
<tr class='<%= if(IsUserAdmin) "" else "hidden" %>' >