FormViewコントロール「にrunat =サーバー」列内に含まれる値を渡していません
-
19-09-2019 - |
質問
私は私の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>
Iは、テーブルの行のためにrunat =「server」を削除した場合、、次いでiPrimaryGroupフィールドは100%結合し、適切なビジネスロジックレイヤに渡されます。しかし、上記のコードの場合には、それはゼロの値が渡されます。
これがあるか、それを回避する方法をなぜ誰も教えてもらえますか?これは、管理者または正規ユーザがそれを編集しているか否かに基づいて、このテーブルの行を非表示にする必要があるコントロールです。すなわち:いくつかのフィールドにのみ書き込み可能な管理され、ユーザが管理者でない場合、私はビューからコントロールを非表示したいと思います。
。解決 3
それが正確に確認されていないのですが、この機能は、設計であることが表示されます。
のhttp://weblogs.asp .NET / rajbk /アーカイブ/ 2009/8月3日/ FormViewコントロール結合-gotcha.aspxする
あなたは、ネストされたコントロールを持っている場合は、双方向のデータバインディングが正常に動作するつもりはない、FormViewコントロールオブジェクトを使用している場合。あなたは、コード内のコントロールにアクセスすることができ、あなたがデータを取得することができますが、ちょうどそれがになっているように、自動的にあなたのビジネスロジック層(BLL)のバックエンドで値を更新するつもりはないです。
幸い、回避策があります。それが働いて取得する方法はItemUpdatingのイベントを作成することです。それは、このようなシグネチャを持つことになります:
protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)
これは次のように順番に、あなたは彼らが飛行中にありながら、ObjectDataSourceの値に変更を加えることができ、彼らはあなたのBLLコードを打つ前にFormViewUpdateEventArgs、にアクセスできます:
protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)
{
if (frmProfile.FindControl("iPrimaryGroupDropDownList") != null)
{
DropDownList iPrimaryGroupDropDownList = ((DropDownList)frmProfile.FindControl("iPrimaryGroupDropDownList"));
e.NewValues["iPrimaryGroup"] = iPrimaryGroupDropDownList.Text;
}
}
他のヒント
セキュリティが懸念される場合は、おそらくこれは良い仕事かもしれません。
<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>
私は間違っていない場合は、
パネル内の任意のマークアップが見える場合はレンダリングされません=偽
これでショットを持っています
にrunatを削除= server属性
CSSクラスを定義します。
.hidden{ display:hidden;}
次に、ユーザが
管理者であるかどうかに基づいて、クラス属性を設定します<tr class='<%= if(IsUserAdmin) "" else "hidden" %>' >