C# 如何在不使用asp.net中的会话的情况下将所选数据(数据列表)从一个页面传输到另一个页面?

C# 如何在不使用asp.net中的会话的情况下将所选数据(数据列表)从一个页面传输到另一个页面?,c#,asp.net,session,C#,Asp.net,Session,我用了两页纸。第一个是父页面,第二个是弹出页面。 我想从弹出页面到父页面检索所选数据。目前我正在使用会话,但我想不使用会话 弹出页面代码如下: List<vw_ServiceandProduct> lstsapm = new List<vw_ServiceandProduct>(); lstsapm = (from a in db.vw_ServiceandProduct where a.IsActive == true && a.BranchID ==

我用了两页纸。第一个是父页面,第二个是弹出页面。 我想从弹出页面到父页面检索所选数据。目前我正在使用会话,但我想不使用会话

弹出页面代码如下:

List<vw_ServiceandProduct> lstsapm = new List<vw_ServiceandProduct>();

lstsapm = (from a in db.vw_ServiceandProduct where a.IsActive == true && a.BranchID == Common.BranchID select a).ToList();

Session["lstsapmsession"] = lstsapm;

Parent page Code is as below :

List<vw_ServiceandProduct> lstsapm = Session["lstsapmsession"] as List<vw_ServiceandProduct>;

GridView1.DataSource = lstsapm;
GridView1.DataBind();
List lstsapm=new List();
lstsapm=(来自db.vw_服务和产品中的a,其中a.IsActive==true&&a.BranchID==Common.BranchID选择a.ToList();
会话[“lstsapmsession”]=lstsapm;
父页面代码如下所示:
将lstsapm=会话[“lstsapmsession”]列为列表;
GridView1.DataSource=lstsapm;
GridView1.DataBind();

既然您提到了内存使用,我建议使用(cookie和查询字符串只能处理这么多数据)。使用此方法,您基本上可以将数据持久化到视图状态(作为隐藏字段实现),并使用HTTPPOST方法四处走动—同时发送视图状态

例如:

public interface ITransferSomething {
  // anything here as long as it is decorated with [Serializable]
  IList<vw_ServiceandProduct> SerializableValue { get; }
  // exposing standard property of System.Web.UI.Page
  bool IsCrossPagePostBack { get; }
}  
公共接口ITransferSomething{
//只要用[Serializable]装饰,这里的任何内容都可以
IList SerializableValue{get;}
//公开System.Web.UI.Page的标准属性
bool IsCrossPagePostBack{get;}
}  
Default.aspx

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
  <asp:LinkButton PostBackUrl="~/Default2.aspx" Text="Transfer!" runat="server" />
</asp:Content>    

Default.aspx.cs

public partial class _Default : System.Web.UI.Page, ITransferSomething {
  protected void Page_Load(object sender, EventArgs e) {
    if (!IsPostBack) {
      SerializableValue = new List<vw_ServiceandProduct> {
        new vw_ServiceandProduct { Name = "foo" }
      };
    }
  }

  public IList<vw_ServiceandProduct> SerializableValue {
    get { return (IList<vw_ServiceandProduct>)ViewState["SerializableValue"]; }
    set { ViewState["SerializableValue"] = value; }
  }
} 
public分部类\u默认值:System.Web.UI.Page,ITransferSomething{
受保护的无效页面加载(对象发送方、事件参数e){
如果(!IsPostBack){
SerializableValue=新列表{
新的vw_服务和产品{Name=“foo”}
};
}
}
公共IList序列化值{
获取{返回(IList)视图状态[“SerializableValue”];}
设置{ViewState[“SerializableValue”]=value;}
}
} 
Default2.aspx.cs

public partial class Default2 : System.Web.UI.Page {
  protected void Page_Load(object sender, EventArgs e) {
    var transfer = Page.PreviousPage as ITransferSomething;
    if (transfer != null && transfer.IsCrossPagePostBack) {
      SerializableValue = transfer.SerializableValue;
    }
  }

  public IList<vw_ServiceandProduct> SerializableValue {
    get { return (IList<vw_ServiceandProduct>)ViewState["SerializableValue"]; }
    set { ViewState["SerializableValue"] = value; }
  }
}
public部分类Default2:System.Web.UI.Page{
受保护的无效页面加载(对象发送方、事件参数e){
var transfer=Page.PreviousPage作为ITransferSomething;
if(transfer!=null&&transfer.IsCrossPagePostBack){
SerializableValue=transfer.SerializableValue;
}
}
公共IList序列化值{
获取{返回(IList)视图状态[“SerializableValue”];}
设置{ViewState[“SerializableValue”]=value;}
}
}

我在评论中描述的方法如下:

List<vw_ServiceandProduct> lstsapm = new List<vw_ServiceandProduct>();
lstsapm = (from a in db.vw_ServiceandProduct where a.IsActive == true && a.BranchID == Common.BranchID select a).ToList();
//Session["lstsapmsession"] = lstsapm;
string key = Guid.NewGuid().ToString("N");
string path = Server.MapPath("~/App_Data/TempFiles/" + key);
DataContractSerializer dcs = new DataContractSerializer(typeof(List<vw_ServiceandProduct>));
using (var outStream = File.OpenWrite(path))
{
    using (XmlDictionaryWriter xdw = XmlDictionaryWriter.CreateTextWriter(outStream, Encoding.UTF8))
    {
        dcs.WriteObject(xdw, lstsapm);
    }
}

// pass key to parent using querystring or cookie


// Parent page Code:
string key = ""; // from cookie or querystring
List<vw_ServiceandProduct> lstsapm = null; //Session["lstsapmsession"] as List<vw_ServiceandProduct>;
string path = Server.MapPath("~/App_Data/TempFiles/" + key);
DataContractSerializer dcs = new DataContractSerializer(typeof(List<vw_ServiceandProduct>));
using (var inStream = File.OpenRead(path))
{
    using (XmlDictionaryReader xdr = XmlDictionaryReader.CreateTextReader(inStream, new XmlDictionaryReaderQuotas()))
    {
        lstsapm = dcs.ReadObject(xdr) as List<vw_ServiceandProduct>;
    }
}
if (lstsapm != null)
{
    GridView1.DataSource = lstsapm;
    GridView1.DataBind();
}
List lstsapm=new List();
lstsapm=(来自db.vw_服务和产品中的a,其中a.IsActive==true&&a.BranchID==Common.BranchID选择a.ToList();
//会话[“lstsapmsession”]=lstsapm;
字符串键=Guid.NewGuid().ToString(“N”);
字符串路径=Server.MapPath(“~/App\u Data/TempFiles/”+键);
DataContractSerializer dcs=新的DataContractSerializer(类型(列表));
使用(var outStream=File.OpenWrite(path))
{
使用(XmlDictionaryWriter xdw=XmlDictionaryWriter.CreateTextWriter(扩展流,编码.UTF8))
{
dcs.WriteObject(xdw、LSTSAP);
}
}
//使用querystring或cookie将密钥传递给父级
//父页面代码:
字符串键=”;//来自cookie或querystring
列表lstsapm=null//会话[“lstsapmsession”]作为列表;
字符串路径=Server.MapPath(“~/App\u Data/TempFiles/”+键);
DataContractSerializer dcs=新的DataContractSerializer(类型(列表));
使用(var inStream=File.OpenRead(path))
{
使用(XmlDictionaryReader xdr=XmlDictionaryReader.CreateTextReader(inStream,新的XmlDictionaryReaderQuotas())
{
lstsapm=dcs.ReadObject(xdr)作为列表;
}
}
如果(lstsapm!=null)
{
GridView1.DataSource=lstsapm;
GridView1.DataBind();
}

您为什么不想使用会话?我不想使用会话,因为有更多的页面必须执行此类操作,并且会消耗更多内存并降低系统速度。请将其序列化为文件,并通过querystring或Cookie传递文件名。请给我任何类似上述代码的序列化示例,我将尝试明天您是否已经在sessionstate方法中遇到了速度减慢和内存问题?你什么意思?