我在FormView的EditItemTemplate中有以下代码:
<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>
如果我删除了表行的runat =“server”,那么iPrimaryGroup字段将100%绑定并正确传递给业务逻辑层。但是,对于上面的代码,它的值为零。
谁能告诉我为什么会这样或如何解决它?这是一个需要隐藏此表行的控件,具体取决于管理员或普通用户是否正在编辑它。即:某些字段只是管理员可写的,如果用户不是管理员,我想隐藏视图中的控件。
答案 0 :(得分:1)
如果担心安全问题,也许这可能会更好
<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>
如果我没有弄错的话,如果visible = false
,则不会呈现面板内的任何标记答案 1 :(得分:0)
对此有所了解:
删除runat = server属性
定义一个css类
.hidden{ display:hidden;}
然后根据用户是否为admin
设置class属性<tr class='<%= if(IsUserAdmin) "" else "hidden" %>' >
答案 2 :(得分:0)
看来这个功能是设计的,虽然没有完全确认。
http://weblogs.asp.net/rajbk/archive/2009/08/03/formview-binding-gotcha.aspx
使用FormView对象时,如果您有嵌套控件,那么双向数据绑定将无法正常工作。您可以在代码中访问控件,并且可以获取数据,但它不会像预期的那样自动更新业务逻辑层(BLL)后端的值。
幸运的是,有一种解决方法。让它工作的方法是为ItemUpdating创建一个事件。它会有这样的签名:
protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)
这使您可以访问FormViewUpdateEventArgs,这反过来又允许您在ObjectDataSource值在飞行中以及在它们命中BLL代码之前对其进行更改,如下所示:
protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)
{
if (frmProfile.FindControl("iPrimaryGroupDropDownList") != null)
{
DropDownList iPrimaryGroupDropDownList = ((DropDownList)frmProfile.FindControl("iPrimaryGroupDropDownList"));
e.NewValues["iPrimaryGroup"] = iPrimaryGroupDropDownList.Text;
}
}