DataSet可以当成内存中的数据库,但是在执行一个Action给DataSet赋值后,再执行另外一个Action,DataSet中的原有数据已经丢失,求大神详解。
暂时没有合适的答案
这个 要了解 类的生命周期,如果跨页了,也要了解页面的生命周期
请问你使用过MVC没
@aehyok:
使用过,知道一点,但是不是很熟。
@Qlin: 额 ,我也是刚用一段时间。
@aehyok:
你还是 把代码 贴出,这样更清楚。
@Qlin:
public class InputModelController : Controller
{
public DataSet DsList = new DataSet();
public ActionResult aa()
{
//给DsList赋值的代码
}
public ActionResult bb()
{
在此获取DsList,但是结果为空
}
}
我先执行aa的Action,然后执行bb的action但是发现DsList为空
@aehyok:
InputModelController 每次请求时,会实例化它,DsList都是新的,要不你就声明为 static变量
@Qlin: 额 ,要是用static声明 那多个用户同时应用此变量的时候,应该会存在问题吧。
@aehyok:
不缓存起来怎么会有值呢
@Qlin: 那多个用户的时候会不会有问题
建议你下个断点看看这个datset在什么时候值被清空了
我按理解,你应该是把他设为了当前controll的全局变量,然后在执行下一次action的时候执行过dataset =null
我可以下断点,执行下一次action的时候dataset=null应该是在内部完成的 我看不到什么时候被清空的
@aehyok:
public DataSet DsList = new DataSet();
很明显这行代码二次运行了
MVC我经常用,这个问题我这样跟你说吧,action是每一次的请求的处理,他是后台的方法,你在aa里面给dataset赋值,只有在相对应的页面里面取得dataset的值,在请求的时候,你又初始化了dataset,所以没有dataset中没有了值
嗯,有点明白了,那我怎么样将aa的dataset传给bb这个action里面。
@aehyok: 那你就需要写一个类,继承Controller,然后你的InputModelController继承你写的类,在你写的类里面声明dataset,在aa里面给dataset赋值,在bb里面取值。我现在用的是这个方法,希望你能采用
@凌风0113:
public class BaseController : Controller
{
protected DataSet ds=new DataSet();
}
具体应该怎么实现,我New了一个 还是不行,是不是因为每次都会new
@aehyok: 不是要每次new出来,是public DataSet ds{ get; set; },你试试这样看能不能满足你的需求。多个用户登陆,每个用户都是一个客户端,所有不会有相互的影响。
找个静态的变量设置吧,或者是cache存放
静态变量多用户登陆有木有问题
@aehyok: 如果你的dataset不是共用的,对于每个人,每次操作都不一样,那可以用cache来实现,或者是定义一个静态的字典类型。然后操作的时候lock一下