I have a FormView with paging enabled. The FormView is bound to an EntityDataSource ...
<asp:EntityDataSource ID="MyEntityDataSource" runat="server"
ConnectionString="name=MyEntitiesContext"
DefaultContainerName="MyEntitiesContext"
EntitySetName="Order"
// ... more stuff to define a q开发者_运维技巧uery
</asp:EntityDataSource>
... which returns a list (IEnumerable) of objects of type Order
from a database. Let's say, my pager is positioned on page 2, so the FormView displays the second object of the list.
The FormView seems to "know" the object it has to display since controls like
<asp:Label ID="MyLabel" runat="server" Text='<%# Eval("MyProperty")%>'/>
magically display the value of "MyProperty" of the correct object.
How can I access this object (the entity of type Order
as a whole, not single properties by using "Eval") in Code-behind?
in the DataBound event handler for your FormView you can do:
Advert ad = FormView1.DataItem.WrappedEntity<Advert>();
Where .WrappedEntity() is an extension method defined as:
/// <summary>
/// Gets the actual EF entity object that is being wrapped and databound.
/// </summary>
/// <example>
/// Advert ad = myFormView.DataItem.WrappedEntity<Advert>();
/// (where myFormView is databound to EntityDataSource returning Advert entity)
/// </example>
static class WrappedEFEntityExtensions
{
public static TEntity WrappedEntity<TEntity>(this object dataItem) where TEntity : class
{
var entity = dataItem as TEntity;
if (entity != null)
return entity;
var typeDescriptor = dataItem as ICustomTypeDescriptor;
if (typeDescriptor != null)
return (TEntity)typeDescriptor.GetPropertyOwner(null);
return null;
}
}
These examples use the EF entity Advert, but you would replace with Order for example.
http://www.dontcodetired.com/blog/post/Accessing-Entity-Framework-Entity-In-EntityDataSource-Data-Bound-Controls.aspx
Full example markup and code:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="stackOF.aspx.cs" Inherits="stackOF" %>
<%@ Register Assembly="System.Web.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
Namespace="System.Web.UI.WebControls" TagPrefix="asp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:EntityDataSource ID="EntityDataSource1" runat="server"
ConnectionString="name=mototradeEntities"
DefaultContainerName="mototradeEntities" EntitySetName="Adverts">
</asp:EntityDataSource>
<asp:FormView ID="FormView1" runat="server" AllowPaging="True"
DataKeyNames="ID" DataSourceID="EntityDataSource1"
ondatabound="FormView1_DataBound">
<ItemTemplate>
ID:<asp:Label ID="IDLabel" runat="server" Text='<%# Eval("ID") %>' />
<%-- other properties here --%>
</ItemTemplate>
</asp:FormView>
</div>
<asp:Label ID="lblTest" runat="server" Text="Label"></asp:Label>
</form>
</body>
</html>
Code behind:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using mototradeModel;
public partial class stackOF : System.Web.UI.Page
{
protected void FormView1_DataBound(object sender, EventArgs e)
{
Advert ad = FormView1.DataItem.WrappedEntity<Advert>();
if (ad != null)
{
lblTest.Text = "current object databound to FormView1: " + ad.ID;
}
}
}
/// <summary>
/// Gets the actual EF entity object that is being wrapped and databound.
/// </summary>
/// <example>
/// Advert ad = myFormView.DataItem.WrappedEntity<Advert>();
/// (where myFormView is databound to EntityDataSource returning Advert entity)
/// </example>
static class WrappedEFEntityExtensions
{
public static TEntity WrappedEntity<TEntity>(this object dataItem) where TEntity : class
{
var entity = dataItem as TEntity;
if (entity != null)
return entity;
var typeDescriptor = dataItem as ICustomTypeDescriptor;
if (typeDescriptor != null)
return (TEntity)typeDescriptor.GetPropertyOwner(null);
return null;
}
}
精彩评论