隐藏QueryString参数,如何实现?

4

我有一个链接,它看起来像这样:http://www.example/about/49
我希望它看起来像http://www.example/about/,但是我必须将这些参数作为QueryString参数传递。

这是否可能?


使用会话变量来存储您想要的内容,并将其绑定到视图状态,以使其适用于每个唯一的用户。 - TheGeekZn
3
不可能在查询字符串中传递并且不想显示它。这是不可能的,你可以重定向到http://www.example/about/49然后获取值49,将其存储在会话变量中,然后重定向到http://www.example/about/49。这个想法几乎没有意义,但这是唯一的方法,没有人会推荐这样做,包括我在内。 - Qasim Javaid Khan
使用查询字符串,我认为你无法做到。 - user1659922
@SonerGönül 不,我不知道从哪里开始,否则我就不会在这里问了。 - hackp0int
我同意@QasimJavaidKhan的观点,如果你隐藏参数,那么控制器就无法从查询字符串中读取参数,所以该方法不会是“HTTPGET”。因此会出现逻辑问题。 - AliRıza Adıyahşi
显示剩余2条评论
2个回答

1
小心使用会话变量,很容易打开多个页面,所有页面都使用相同的会话并混合值。
最好使用TempData,它只允许值被使用一次(在第一次访问时删除)。但是,这意味着该值几乎立即会被使用。
您还可以编写一个带有所需值的cookie,拦截请求(ASP.Net提供了各种方法来执行此操作,例如BeginRequest事件),并在内部处理URL,就像它包含该值一样。
当然,您随后必须清除cookie(这将与基于Session的解决方案具有相同的问题)。请记住,cookie更容易受到客户端篡改的影响。
就我个人而言,我认为任何这些方法都比它们的价值更麻烦。 "可黑客化的URL"(例如那些包含可能有意义的ID的URL)通常是一件好事。

0

我的解决方法(得益于SO社区的帮助,非常有效)

创建一个名为SiteSession.cs的类

输入以下代码:

using System;
using System.Collections.Generic;
using System.Web;

/// <summary>
/// Summary description for SiteSession
/// </summary>
public class SiteSession
{
    /// <summary>
    /// The _site session
    /// </summary>
    private const string _siteSession = "__SiteSession__";


    /// <summary>
    /// Prevents a default instance of the <see cref="SiteSession" /> class from being created.
    /// </summary>
    private SiteSession()
    {
    }

    /// <summary>
    /// Gets the current Session
    /// </summary>
    /// <value>The current.</value>
    public static SiteSession Current
    {
        get
        {
            SiteSession session = new SiteSession();
            try
            {
                session = HttpContext.Current.Session[_siteSession] as SiteSession;
            }
            catch(NullReferenceException asp)
            {

            }

            if (session == null)
            {
                session = new SiteSession();
                HttpContext.Current.Session[_siteSession] = session;
            }
            return session;
        }
    }

    //Session properties
    public int PageNumber {get;set;}

}

您可以将任何内容放入Session Properties中,只需确保其为公共的。

然后,通过以下方式进行设置:

SiteSession.Current.PageNumber = 42

并使用以下方式调用:

int whatever = SiteSession.Current.PageNumber


整个重点是保持不在会话中以及隐藏这些内容,我想在这个区域使用URL重写器或类似的东西。 - hackp0int
你不能隐藏QueryString或URL输入中的任何其他内容,这违反了客户端浏览器规则。唯一可以隐藏的是在网页中。如果您真的不想使用会话,则会很困难。 - TheGeekZn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接