Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 最后五页_Asp.net_Vb.net_Cookies - Fatal编程技术网

Asp.net 最后五页

Asp.net 最后五页,asp.net,vb.net,cookies,Asp.net,Vb.net,Cookies,所以,我有一系列的产品页面,我想做的就是将最后5个产品存储在cookie中,这样它就可以显示为站点历史记录。我遇到的问题不是将五个初始项添加到cookie中,而是当它们查看6、7或10个项时。有没有人对如何解决这一问题有什么好的建议 目前我的逻辑有缺陷(为了简洁起见,我已经替换了cookie名称(xxx)) 欢迎并赞赏提出建议和批评 克里斯如果我正确理解你的问题,我将这样做:) 如果产品数量小于5,只需添加新产品。否则将product0替换为product1直到4,然后在4添加新产品 I

所以,我有一系列的产品页面,我想做的就是将最后5个产品存储在cookie中,这样它就可以显示为站点历史记录。我遇到的问题不是将五个初始项添加到cookie中,而是当它们查看6、7或10个项时。有没有人对如何解决这一问题有什么好的建议

目前我的逻辑有缺陷(为了简洁起见,我已经替换了cookie名称(xxx))

欢迎并赞赏提出建议和批评


克里斯

如果我正确理解你的问题,我将这样做:)
如果产品数量小于5,只需添加新产品。否则将product0替换为product1直到4,然后在4添加新产品

    If productcount < 5 Then 'Do the null value check before this
        HttpContext.Current.Response.Cookies("xxx")("productcount") = productCount + 1
        HttpContext.Current.Response.Cookies("xxx")("product" & productCount + 1) = ""

    Else
        For i = 0 To productcount - 1
           'Replace product 0 with 1, 1 with 2...till 3 with 4 
            HttpContext.Current.Response.Cookies("xxx")("product" & i & "") = HttpContext.Current.Response.Cookies("xxx")("product" & i + 1& "")

       Next
       HttpContext.Current.Response.Cookies("xxx")("product" & 4 & "") =  Request.QueryString("id")
    End If
如果productcount<5,则“在此之前执行空值检查”
HttpContext.Current.Response.Cookies(“xxx”)(“productcount”)=productcount+1
HttpContext.Current.Response.Cookies(“xxx”)(“产品”和产品计数+1)=“”
其他的
对于i=0到productcount-1
'将产品0替换为1,1替换为2…直到3替换为4
HttpContext.Current.Response.Cookies(“xxx”)(“产品”&i&“)=HttpContext.Current.Response.Cookies(“xxx”)(“产品”&i+1&“)
下一个
HttpContext.Current.Response.Cookies(“xxx”)(“产品”&4&“)=Request.QueryString(“id”)
如果结束

只需使用一个简单的cookie值,该值是最近查看的产品ID的逗号分隔列表。(请注意,我的VB.NET非常强大)

  • 现在,您可以通过简单的字符串数组访问最新的产品ID
  • 此代码处理尚未创建cookie的情况
  • 饼干本身要小得多
  • 管理列表的大小很容易被参数化
上面的代码基于我放入空ASPX文件的下面经过测试的C#代码:-

const int listSize = 8;
string[] _mru;

protected void Page_Load(object sender, EventArgs e)
{
    HttpCookie cookie = Request.Cookies["mru"];
    Queue<string> mru;
    if (cookie != null)
    {
        mru = new Queue<string>(cookie.Value.Split(','));
    }
    else
    {
        mru = new Queue<string>();
        cookie = new HttpCookie("mru"); 
    }

    if (!mru.Contains(Request.QueryString["id"]))
    {
        if (mru.Count >= listSize) mru.Dequeue();

        mru.Enqueue(Request.QueryString["id"]);
    }

    _mru = mru.ToArray();

    cookie.Value = String.Join(",", _mru);
    cookie.Expires = DateTime.Now.AddDays(365);

    Response.Cookies.Add(cookie);

}
const int listSize=8;
字符串[]\u mru;
受保护的无效页面加载(对象发送方、事件参数e)
{
HttpCookie cookie=Request.Cookies[“mru”];
队列mru;
if(cookie!=null)
{
mru=新队列(cookie.Value.Split(',');
}
其他的
{
mru=新队列();
cookie=新的HttpCookie(“mru”);
}
如果(!mru.Contains(Request.QueryString[“id”]))
{
如果(mru.Count>=listSize)mru.Dequeue();
mru.Enqueue(Request.QueryString[“id”]);
}
_mru=mru.ToArray();
cookie.Value=String.Join(“,”,_-mru);
cookie.Expires=DateTime.Now.AddDays(365);
Response.Cookies.Add(cookie);
}

Anthony完美地回答了这个问题,但为了将来的参考和使用VB的人,下面是代码:

    Imports System.Collections.Generic

    Const listSize As Integer = 5
    Private _mru As String()

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim cookie As HttpCookie = Request.Cookies("mru")

        Dim mru As Queue(Of String)
        If cookie IsNot Nothing Then
            mru = New Queue(Of String)(cookie.Value.Split(","c))
        Else
            mru = New Queue(Of String)()
            cookie = New HttpCookie("mru")
        End If

        If mru.Count >= listSize Then
            mru.Dequeue()
        End If

        mru.Enqueue(Request.QueryString("id"))

        _mru = mru.ToArray()

        cookie.Value = [String].Join(",", _mru)
        cookie.Expires = DateTime.Now.AddDays(365)


        Response.Cookies.Add(cookie)
End Sub

非常感谢这里的所有贡献者。

嗨,安东尼,我刚学会如何为问题选择合适的数据结构。您能解释一下为什么选择队列而不是堆栈吗?当我最初阅读他的问题时,我认为堆栈最适合,因为他想显示用户访问的最后5项,堆栈是LIFO。@Jon,对于最近使用的列表,您需要FIFO结构。考虑一下,当达到容量时,在插入当前的一个项目之前,你要把最后一个项目从栈中弹出。这将导致堆栈中的第一个项目保留在那里,并且只有顶部的项目在达到容量后才会更改。需要首先删除列表中最旧的项,即底部项而不是顶部项。首先删除底部项目是FIFO(队列)而不是LIFO(堆栈)的操作。非常感谢您的解释!这是一个很大的帮助,现在很有意义。这是一个比我的更好的解决方案。。我刚刚纠正了你的错误implementation@Anthony,非常感谢-这是惊人的,工作非常出色。我从来都不知道collections类,但是这里有各种各样的东西可以帮助解决一些最不寻常的问题。我将发布VB以供参考……)
const int listSize = 8;
string[] _mru;

protected void Page_Load(object sender, EventArgs e)
{
    HttpCookie cookie = Request.Cookies["mru"];
    Queue<string> mru;
    if (cookie != null)
    {
        mru = new Queue<string>(cookie.Value.Split(','));
    }
    else
    {
        mru = new Queue<string>();
        cookie = new HttpCookie("mru"); 
    }

    if (!mru.Contains(Request.QueryString["id"]))
    {
        if (mru.Count >= listSize) mru.Dequeue();

        mru.Enqueue(Request.QueryString["id"]);
    }

    _mru = mru.ToArray();

    cookie.Value = String.Join(",", _mru);
    cookie.Expires = DateTime.Now.AddDays(365);

    Response.Cookies.Add(cookie);

}
    Imports System.Collections.Generic

    Const listSize As Integer = 5
    Private _mru As String()

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim cookie As HttpCookie = Request.Cookies("mru")

        Dim mru As Queue(Of String)
        If cookie IsNot Nothing Then
            mru = New Queue(Of String)(cookie.Value.Split(","c))
        Else
            mru = New Queue(Of String)()
            cookie = New HttpCookie("mru")
        End If

        If mru.Count >= listSize Then
            mru.Dequeue()
        End If

        mru.Enqueue(Request.QueryString("id"))

        _mru = mru.ToArray()

        cookie.Value = [String].Join(",", _mru)
        cookie.Expires = DateTime.Now.AddDays(365)


        Response.Cookies.Add(cookie)
End Sub