FormView不传递“runat = server”行中包含的值

时间:2009-11-11 15:36:22

标签: data-binding binding formview runat

我在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%绑定并正确传递给业务逻辑层。但是,对于上面的代码,它的值为零。

谁能告诉我为什么会这样或如何解决它?这是一个需要隐藏此表行的控件,具体取决于管理员或普通用户是否正在编辑它。即:某些字段只是管理员可写的,如果用户不是管理员,我想隐藏视图中的控件。

3 个答案:

答案 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;
    }
}