FormView non passa attraverso un valore contenuto all'interno “runat = server” fila
-
19-09-2019 - |
Domanda
Ho il seguente codice nel EditItemTemplate della mia 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>
Se rimuovo il runat = "server" per la riga della tabella, allora il campo iPrimaryGroup è legato al 100% e passa al livello di logica di business in modo corretto. Tuttavia, nel caso del codice precedente, si passa da un valore di zero.
Qualcuno può dirmi perché questo è o come ottenere intorno ad esso? Questo è in un controllo che ha bisogno di nascondere questa riga della tabella, sulla base o meno di un amministratore o un utente regolare lo sta modificando. vale a dire:. alcuni campi sono Amministratore soltanto scrivibile e vorrei per nascondere i controlli dalla vista se l'utente non è un amministratore
Soluzione 3
Sembra che questa funzionalità è di progettazione, anche se questo non è esattamente confermato.
http: //weblogs.asp .net / rajbk / archive / 2009/08/03 / formview-binding-gotcha.aspx
Quando si utilizza l'oggetto FormView, se si dispone di un controllo nidificato, quindi a due vie databinding non è andare a lavorare correttamente. È possibile accedere ai controlli nel codice, e si può ottenere i dati, ma non è solo andare per aggiornare automaticamente il valore del back-end del vostro livello Business Logic (BLL), come si suppone.
Per fortuna, c'è una soluzione alternativa. Il modo per farlo funzionare è quello di creare un evento per ItemUpdating. Avrà una firma in questo modo:
protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)
Ciò consente di accedere alle FormViewUpdateEventArgs, che a sua volta consente di effettuare modifiche ai valori ObjectDataSource mentre sono in volo e prima che colpiscano il codice BLL, come segue:
protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)
{
if (frmProfile.FindControl("iPrimaryGroupDropDownList") != null)
{
DropDownList iPrimaryGroupDropDownList = ((DropDownList)frmProfile.FindControl("iPrimaryGroupDropDownList"));
e.NewValues["iPrimaryGroup"] = iPrimaryGroupDropDownList.Text;
}
}
Altri suggerimenti
Se la sicurezza è una preoccupazione forse questo potrebbe funzionare meglio
<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>
Se non sbaglio non sarà reso nessun marcatore all'interno del pannello se visibile = false
avere un colpo a questo:
Rimuovere l'attributo runat = server
Definire una classe CSS
.hidden{ display:hidden;}
Quindi impostare l'attributo di classe in base a se l'utente è un amministratore
<tr class='<%= if(IsUserAdmin) "" else "hidden" %>' >