Question

Je le code suivant dans le EditItemTemplate de mon 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>

Si je supprime le runat = « server » pour la ligne de table, le champ iPrimaryGroup est lié à 100% et transmis à la couche logique métier correctement. Toutefois, dans le cas du code ci-dessus, il est transmis avec une valeur de zéro.

Quelqu'un peut-il me dire pourquoi est-ce ou comment la contourner? Ceci est un contrôle qui doit cacher cette ligne de table, sur la base ou non un administrateur ou un utilisateur régulier est le modifier. à savoir:. certains champs sont admin inscriptible seulement et je voudrais cacher les contrôles de la vue si l'utilisateur n'est pas un admin

Était-ce utile?

La solution 3

Il semble que cette fonctionnalité est par sa conception, même si ce n'est pas exactement confirmé.

http: //weblogs.asp .net / rajbk / archive / 2009/08/03 / gotcha.aspx-contraignant formview

Lorsque vous utilisez l'objet FormView, si vous avez un contrôle imbriqué, databinding dans les deux sens ne va pas fonctionner correctement. Vous pouvez accéder aux commandes dans le code, et vous pouvez obtenir les données, mais il est tout simplement pas mettre à jour automatiquement la valeur de l'extrémité arrière de votre couche logique métier (BLL) comme il est censé le faire.

Heureusement, il y a une solution de contournement. La façon de le faire fonctionner est de créer un événement pour ItemUpdating. Il aura une signature comme ceci:

protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)

Cela vous donne accès aux FormViewUpdateEventArgs, ce qui vous permet d'apporter des modifications aux valeurs ObjectDataSource alors qu'ils sont en vol et avant de frapper votre code BLL, comme suit:

protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)
{
    if (frmProfile.FindControl("iPrimaryGroupDropDownList") != null)
    {
        DropDownList iPrimaryGroupDropDownList = ((DropDownList)frmProfile.FindControl("iPrimaryGroupDropDownList"));
        e.NewValues["iPrimaryGroup"] = iPrimaryGroupDropDownList.Text;
    }
}

Autres conseils

Si la sécurité est une préoccupation peut-être cela pourrait fonctionner mieux

<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>

Si je ne me trompe pas une balise dans le panneau ne sera pas rendu si visible = false

Avoir un coup de feu à ceci:

Supprimer l'attribut runat = serveur

Définir une classe css

.hidden{ display:hidden;}

Ensuite, réglez l'attribut de classe basée sur si oui ou non l'utilisateur est un admin

<tr class='<%= if(IsUserAdmin) "" else "hidden" %>' >
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top