如何在ASP.net c#中的页面之间传递对象而不是值?

如何在ASP.net c#中的页面之间传递对象而不是值?,c#,asp.net,C#,Asp.net,此时,我将值从一页传递到另一页。我需要在页面之间传递对象,如何才能做到这一点 非常感谢您的帮助。是否将对象保存在会话或缓存中,然后重定向到其他页面? 假设您将项目添加到会话中的a.aspx中有a.aspx Session["Item"] = myObjectInstance; 在b.aspx中,您将获得对象 var myObjectInstance = (MyObjectInstance) Session["Item"]; 但是在使用会话之前,您应该检查会话中是否设置了任何值。通常的方法是

此时,我将值从一页传递到另一页。我需要在页面之间传递对象,如何才能做到这一点


非常感谢您的帮助。

是否将对象保存在会话或缓存中,然后重定向到其他页面? 假设您将项目添加到会话中的a.aspx中有a.aspx

Session["Item"] = myObjectInstance; 
在b.aspx中,您将获得对象

var myObjectInstance = (MyObjectInstance) Session["Item"];

但是在使用会话之前,您应该检查会话中是否设置了任何值。

通常的方法是将这些值放入会话中。然而,会话变量的经验法则是它们应该保持在最小值

我们要做的是将状态保存在“stateserver”中。这只是数据库中按用户存储值的表

此表有一个xml列,其中包含来自我们所在州的对象,这些对象是。缺点是您依赖于xmlserializer,而且它非常简单。加上性能方面。。。对于每个请求,您需要执行查询、反序列化状态、处理请求、再次序列化状态并将更改更新回数据库。当你有一个高流量的网站时,这不是很理想


如果硬件没有问题,更好的选择是使用,只使用会话。

您可以将对象序列化到HTML中的
输入
字段中,并通过
表单
提交。然后使用
请求['paramName']
将其反序列化回表单提交到的页面上的对象

/// <summary>
/// Serialize an object
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static string Serialize<T>(T data)
{
    string functionReturnValue = string.Empty;

    using (var memoryStream = new MemoryStream())
    {
        var serializer = new DataContractSerializer(typeof(T));
        serializer.WriteObject(memoryStream, data);

        memoryStream.Seek(0, SeekOrigin.Begin);

        var reader = new StreamReader(memoryStream);
        functionReturnValue = reader.ReadToEnd();
    }

    return functionReturnValue;
}

/// <summary>
/// Deserialize object
/// </summary>
/// <param name="xml"></param>
/// <returns>Object<T></returns>
public static T Deserialize<T>(string xml)
{
    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
    {
        var serializer = new DataContractSerializer(typeof(T));
        T theObject = (T)serializer.ReadObject(stream);
        return theObject;
    }
}
//
///序列化对象
/// 
/// 
/// 
公共静态字符串序列化(T数据)
{
string functionReturnValue=string.Empty;
使用(var memoryStream=new memoryStream())
{
var serializer=新的DataContractSerializer(typeof(T));
serializer.WriteObject(memoryStream,data);
memoryStream.Seek(0,SeekOrigin.Begin);
变量读取器=新的流读取器(memoryStream);
functionReturnValue=reader.ReadToEnd();
}
返回函数returnvalue;
}
/// 
///反序列化对象
/// 
/// 
///反对
公共静态T反序列化(字符串xml)
{
使用(var stream=newmemoryStream(Encoding.UTF8.GetBytes(xml)))
{
var serializer=新的DataContractSerializer(typeof(T));
T theObject=(T)serializer.ReadObject(流);
返回对象;
}
}

当您通过URL传递数据时,请不要忘记对数据进行HTML编码。

您可以非常轻松地在ASP中序列化对象,以下三种方法适用于不同类型的需求:

1-使用会话在Asp上传递对象:

//In A.aspx
//Serialize.
Object obj = MyObject;
Session["Passing Object"] = obj;

//In B.aspx
//DeSerialize.
MyObject obj1 = (MyObject)Session["Passing Object"];

Returntype of the method xyx = obj.Method;//Using the deserialized data.
2-要保存Asp项目解决方案本身,请执行以下操作:

//Create a folder in your asp project solution with name "MyFile.bin"
//In A.aspx
//Serialize.
IFormatter formatterSerialize = new BinaryFormatter();
Stream streamSerialize = new FileStream(Server.MapPath("MyFile.bin/MyFiles.xml"), FileMode.Create, FileAccess.Write, FileShare.None);
formatterSerialize.Serialize(streamSerialize, MyObject);
streamSerialize.Close();

//In B.aspx
//DeSerialize.
IFormatter formatterDeSerialize = new BinaryFormatter();
Stream streamDeSerialize = new FileStream(Server.MapPath("MyFile.bin/MyFiles.xml"), FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject)formatterDeSerialize.Deserialize(streamDeSerialize);
streamDeSerialize.Close();

Returntype of the method xyx = obj.Method;//Using the deserialized data.
3-在客户端计算机上保存

String fileName = @"C:\MyFiles.xml";//you can keep any extension like .xyz or .yourname, anything, not an issue.
//In A.aspx
//Serialize.
IFormatter formatterSerialize = new BinaryFormatter();
Stream streamSerialize = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None);
formatterSerialize.Serialize(streamSerialize, MyObject);
streamSerialize.Close();

//In B.aspx
//DeSerialize.
IFormatter formatterDeSerialize = new BinaryFormatter();
Stream stream1 = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject)formatterDeSerialize.Deserialize(stream1);
stream1.Close();

Returntype of the method xyx = obj.Method;//Using the deserialized data.

将多个对象序列化为xml文件中的列表元素并反序列化

using System.Xml.Serialization;

[XmlRoot("ClassList")]
[XmlInclude(typeof(ClassElements))] //Adds class containing elentsof list
public class ClassList
{
    private String FFolderName;
    private List<ClassElements> ListOfElements;

    [XmlArray("ClassListArray")]
    [XmlArrayItem("ClassElementObjects")]
    public List<ClassElements> ListOfElements = new List<ClassElements>();

    [XmlElement("Listname")]
    public string Listname { get; set; }

    public void InitilizeClassVars() 
    {

    }

    public ClassList() 
    {
        InitilizeClassVars();
    }

    public void AddClassElementObjects aItem)
    {
        ListOfElements.Add(aItem);
    }
}

[XmlType("ClassElements")]
public class ClassElements
{
    private String str1;
    private int iInt;
    private Double dblDouble;

    [XmlAttribute("str", DataType = "string")]
    public String str
    {
        get { return str; }
    }

    [XmlElement("iInt")]
    public int iInt
    {
        get { return iInt;}
        set { iInt = value; }
    }

    [XmlElement("dblDouble")]
    public Double dblDouble
    {
        get { return dblDouble; }
        set { dblDouble = value; }
    }

    public void InitilizeClassVars()
    {

    }

    public ClassElements()
    {
        InitilizeClassVars();
    }
}

请参阅:当您说-您将值从一个页面传递到另一个页面时,我假设您指的是QueryString。。。。您可能希望使用会话将数据从一个页面传递到另一个页面。但是,还有其他替代方案(缓存对象/应用程序对象)可以根据需求管理页面之间的数据。如果我想使用会话进行管理,您能否提供一些代码?
ClassList ListOfObjs = new ClassList();
int Count = 5;

for (int i = 0; i < Count; i++)
{
    ClassElements NewObj = new ClassElements();
    NewObj.str = "Hi";
    NewObj.iInt = 500;
    NewObj.dblDouble = 5000;
    ListOfObjs.Add(NewObj);
}

// Serialize 
String fileName = @"C:\MyFiles.xml";

Type[] elements = { typeof(ClassElements) };
XmlSerializer serializer = new XmlSerializer(typeof(ClassList), elements);
FileStream fs = new FileStream(fileName, FileMode.Create);
serializer.Serialize(fs, ListOfObjs);
fs.Close();
ListOfObjs = null;
ClassList ListOfObjs = new ClassList();

String fileName = @"C:\MyFiles.xml";

// Deserialize 
fs = new FileStream(fileName , FileMode.Open);
personen = (ListOfObjs)serializer.Deserialize(fs);
serializer.Serialize(Console.Out, ListOfObjs);