0

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% バインドされ、ビジネス ロジック層に適切に渡されます。ただし、上記のコードの場合、値ゼロで渡されます。

これがなぜなのか、それを回避する方法を誰か教えてもらえますか? これは、管理者または通常のユーザーが編集しているかどうかに基づいて、このテーブル行を非表示にする必要があるコントロールにあります。つまり、一部のフィールドは管理者のみが書き込み可能であり、ユーザーが管理者でない場合はビューからコントロールを非表示にしたいと考えています。

4

3 に答える 3

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 の場合、パネル内のマークアップはレンダリングされません。

于 2009-11-11T23:13:53.870 に答える
0

これを試してみてください:

runat=server属性を削除します

cssクラスを定義する

.hidden{ display:hidden;}

次に、ユーザーが管理者であるかどうかに基づいてクラス属性を設定します

<tr class='<%= if(IsUserAdmin) "" else "hidden" %>' >
于 2009-11-11T16:02:35.787 に答える
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;
    }
}
于 2009-11-13T04:58:08.457 に答える