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

È stato utile?

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" %>' >
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top