Pregunta

Tengo el siguiente código en el EditItemTemplate de mi 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 elimino el runat = "servidor" para la fila de la tabla, entonces el campo iPrimaryGroup está obligado 100% y se pasa a la capa de lógica de negocio correctamente. Sin embargo en el caso de que el código anterior, se pasa con un valor de cero.

Puede alguien decirme por qué esto es o cómo conseguir alrededor de él? Esto está en un control que necesita para ocultar esta fila de la tabla, en función de si o no un administrador o un usuario normal está editando. es decir:. algunos campos son admin solamente se puede escribir y me gustaría para ocultar los controles de la vista si el usuario no es un administrador

¿Fue útil?

Solución 3

Parece que esta funcionalidad es por diseño, aunque esto no está confirmado exactamente.

http: //weblogs.asp .net / rajbk / archivo / 2009/08/03 / formview vinculante-gotcha.aspx

Cuando se utiliza el objeto FormView, si usted tiene un control anidado, luego de dos vías de enlace de datos no va a funcionar correctamente. Puede acceder a los controles en el código, y se puede conseguir en los datos, pero simplemente no va a actualizar automáticamente el valor en el extremo posterior de la capa de lógica de negocios (BLL) como se supone a.

Afortunadamente, hay una solución. La manera de conseguir que funcione es crear un evento para ItemUpdating. Se tendrá una firma como esta:

protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)

Esto le da acceso a los FormViewUpdateEventArgs, que a su vez le permite realizar cambios en los valores de ObjectDataSource mientras están en vuelo y antes de que lleguen a su código de BLL, de la siguiente manera:

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

Otros consejos

Si la seguridad es una preocupación tal vez esto podría funcionar mejor

<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 no me equivoco cualquier tipo de código dentro del panel no se brindará si visible = false

Tener una oportunidad en esto:

Quitar el atributo runat = server

Definir una clase css

.hidden{ display:hidden;}

A continuación, establezca el atributo de clase en función de si o no el usuario es un administrador

<tr class='<%= if(IsUserAdmin) "" else "hidden" %>' >
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top