如何在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);