Pergunta

Eu tenho o seguinte código no EditItemTemplate do meu 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 eu remover o runat = "server" para a linha da tabela, então o campo iPrimaryGroup está vinculado 100% e passou para a camada de lógica de negócios corretamente. No entanto, no caso do código acima, ele é passado com um valor de zero.

Alguém pode me dizer por que isso é ou como obter em torno dele? Isto está em um controle que precisa ocultar esta linha da tabela, com base em se ou não um administrador ou um usuário regular é editá-lo. ou seja: alguns campos são apenas gravável admin e eu gostaria de ocultar os controles do ponto de vista se o usuário não é um administrador

.
Foi útil?

Solução 3

Parece que esta funcionalidade é por design, embora isso não é exatamente confirmada.

http: //weblogs.asp .net / rajbk / Arquivo / 2009/08/03 / formview vinculativo de gotcha.aspx

Ao usar o objeto FormView, se você tem um controle aninhado, depois de duas vias de ligação de dados não vai funcionar corretamente. Você pode acessar os controles em código, e você pode obter os dados, mas ele simplesmente não vai atualizar automaticamente o valor no final de trás de sua camada de lógica de negócios (BLL) como é suposto.

Felizmente, há uma solução alternativa. A maneira de fazê-lo funcionar é criar um evento para ItemUpdating. Ela terá uma assinatura como esta:

protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)

Isto dá-lhe acesso às FormViewUpdateEventArgs, que por sua vez permite que você faça alterações nos valores ObjectDataSource, enquanto eles estão em vôo e antes que eles atinjam o seu código BLL, da seguinte forma:

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

Outras dicas

Se a segurança é uma preocupação, talvez, isso pode funcionar melhor

<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 não me engano qualquer marcação dentro do painel não será processado se visível = false

Tenha um tiro neste:

Remova o atributo runat = servidor

Defina uma classe css

.hidden{ display:hidden;}

Em seguida, defina o atributo de classe com base em se ou não o usuário é um administrador

<tr class='<%= if(IsUserAdmin) "" else "hidden" %>' >
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top