2009-11-11 82 views
0

值我在FormView控件的EditItemTemplate中下面的代码:FormView控件没有通过包含在“RUNAT =服务器”

<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 =“服务器”为表行,然后iPrimaryGroup字段绑定100%并正确传递到业务逻辑层。但是,在上面的代码中,它的值为零。

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

回答

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,这反过来又可以让你,而他们在飞行中,他们打你的BLL代码之前更改到ObjectDataSource值,如下所示:

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

有这一个镜头:

删除RUNAT =服务器属性

定义CSS类

.hidden{ display:hidden;} 

然后设置类属性根据用户是否为管理员

<tr class='<%= if(IsUserAdmin) "" else "hidden" %>' > 
+0

我会试试这个,让你知道。我认为这会带来安全风险,因为控制措施仍然会发送给客户。使用类似Firebug的东西,他们可以删除CSS类,然后修改这些控件中的数据。这些控件处理应用的安全权限。 我会试试看,并让你知道,但我的怀疑是,它不会做我所需要的。我真的不想重构代码,但会做需要做的事情。 任何人都有这样想的原因吗? – 2009-11-11 21:16:36

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> 

如果我没有记错的面板内的任何标记将不可见的,如果被渲染=假

+0

谢谢迈克尔,但问题是,这是在FormView中。当DropDownList包含在指定runat = server的一组标记中时,无论组件是否显示,iPrimaryGroup的绑定值都将作为零传递到后端。我需要想办法解决这个问题,因为值没有被更新。 – 2009-11-12 02:03:34

+0

嘿迈克,我做了一些测试,并发现该行具有runat = server属性时出现同样的问题。不完全确定那里发生了什么。不过,我使用上面的代码成功检索了值。 – 2009-11-12 16:22:13

+0

我打算为您尝试并为您的答案投票,但我找到了真正的答案以及如何避开它。 – 2009-11-13 04:48:20

相关问题