FormView não passando um valor contido dentro “runat = server” linha
-
19-09-2019 - |
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
.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" %>' >