動的データを使用する場合、ユーザーが自分の名前/ID を含むレコードのみを表示できるようにする方法はありますか? つまり、データをフィルタリングすると、すべてのユーザーではなく、ユーザーの情報のみが表示されます。
1 に答える
動的データのセキュリティ実装については、Oleg Sych著のASP.NET Dynamic Data Unleashedという優れた書籍をお勧めします。
あなたのケースに関しては、私が理解しているように、現在ログインしているユーザーのIDまたは名前を含むレコードのみをList.aspxページのGridViewに表示する必要があります。
動的データのアプローチを維持しながら問題を解決する最も簡単な方法を考えてみましょう。
ユーザーが動的データ サイトにアクセスする方法を考慮せずに、 List.aspxのコード ビハインドでユーザーIDを取得したと仮定します。簡単にするために、テーブルに user Idが含まれていると仮定します。
List.aspx.cs (部分的)
public partial class List : System.Web.UI.Page
{
protected int userId;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
userId = GetLoggedUser();
}
}
}
次に、特殊な非ビジュアル コントロールQueryExtenderを使用し、TargetControlID プロパティを使用して、それを LINQ ベースのデータ ソース コントロールに関連付けます (この場合、EntityDataSource があると仮定します)。
List.aspx (部分的)
<asp:GridView
ID="gvTest"
runat="server"
DataSourceID="DetailsDataSourceTest"
AllowPaging="true"
AllowSorting="false"
PageSize="10"
CssClass="gridview"
AutoGenerateColumns="false">
<Columns>
<asp:DynamicField DataField="UserId" />
<asp:DynamicField DataField="Col1" />
<asp:DynamicField DataField="Col2" />
<asp:DynamicField DataField="Col3" />
</Columns>
</asp:GridView>
<asp:EntityDataSource
ID="DetailsDataSourceTest"
runat="server"
ConnectionString="name=TestEntities"
DefaultContainerName="TestEntities"
EnableFlattening="false"
EntitySetName="TableTestName" />
<asp:QueryExtender
ID="QueryExtenderTest"
runat="server"
TargetControlID="DetailsDataSourceTest">
<asp:CustomExpression OnQuerying="QueryExtenderTest_Querying" />
</asp:QueryExtender>
ご覧のとおり、 QueryExtenderコントロールのCustomExpressionオプションを使用し、そのOnQuerying属性をQueryExtenderTest_Queryingに設定します。これにより、カスタムLINQ クエリを実行できるようになります。
List.aspx.cs (部分的)
protected void QueryExtenderTest_Querying(object sender, System.Web.UI.WebControls.Expressions.CustomExpressionEventArgs e)
{
if (/* check userId if you would like */)
{
e.Query = (from c in e.Query.Cast<TableTestName>()
where (c.UserId == userId)
select c);
}
}
詳細については:
チュートリアル: 宣言型構文を使用した Web ページ内のデータのフィルター処理
編集:
その単純なソリューションに基づいて、動的データ サイトでのルーティングの実装に応じて、ユーザーがクエリ文字列を介して所有していないレコードにアクセスできないように、Details.aspx ページと Edit.aspx ページでカスタム LINQ を使用する必要があります。