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

.
War es hilfreich?

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

Hat

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" %>' >
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top