如何在ASP.NET中隐藏页面名称和查询字符串?

时间:2013-11-01 07:59:50

标签: asp.net iis-7 asp.net-4.0 asp.net-4.5

我想在asp.net中设置URL Masking以隐藏URL中的页面名称和查询字符串。

目前我在下面设置代码以在全局应用程序文件中执行URL重写。

routeCollection.MapPageRoute("Login", "Login", "~/frmLogin.aspx");

但是我想以一种只向最终用户显示域名的方式重写URL。 http://www.domainname.com - 就像这样

请帮我设置。

提前致谢,

6 个答案:

答案 0 :(得分:3)

您可以将frmLogin.aspx页面设置为Web服务器中的默认页面。

如果您使用的是IIS 7,则步骤如下:

 1.Select your website
 2. In description click on default document
 3. Add your page (frmLogin.aspx) in and set its priority.

答案 1 :(得分:2)

我们在应用程序中使用以下方法仅在域上显示签名页面。它也可以修改为其他页面。

在Global.asax中:

routeCollection.MapPageRoute("SIGNIN", String.Empty, "~/signin.aspx");

答案 2 :(得分:1)

如果您使用域掩码,那么没有代码更改,您可以获得相同的结果。

答案 3 :(得分:1)

我尝试了以下方法用于实验目的。所以我不知道它会如何在回复的复杂页面上表现。

当您请求www.domainname.com时,实际请求将转至www.domainname.com /default.aspx或您设置的任何其他默认页面。在默认页面加载中,第一件事是检查名为'pagetoview'的任何会话,如果已设置,则server.transfer到该页面,否则服务器默认页面。

现在假设用户从页面转到form.aspx'。 form.aspx load方法应检查pagetoview会话变量,如果它与当前页面名称相同,则取消设置并继续将pagetoview变量设置为当前页面名称并重定向到域。

将检查默认页面并发生server.transfer。希望你能用这种奇怪的方法获得一些观点。

答案 4 :(得分:1)

你应该使用cookie和用户控件来模拟asp.net路由。 所以我们只有一个名为default.aspx的aspx文件,其他页面应该放在用户控件中。 将此脚本放在default.aspx:

的末尾
<script src="https://code.jquery.com/jquery-2.2.0.min.js" type="text/javascript"></script>
<script>
    $(document).ready(function () {
        $("a").click(function (e) {
            e.preventDefault();
            var attrHref = $(this).attr("href");
            $.getJSON("/service.asmx/SetRouteCookie", { href: attrHref }, function (e) {
                window.location.reload();
            });
        });
    });
</script>

此脚本禁用所有链接行为,然后我们手动处理点击事件。 在click事件中,我们通过ajax调用Web服务方法。此服务设置某个cookie来保存当前页面:

[WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json, XmlSerializeString = false, UseHttpGet = true)]
    public void SetRouteCookie()
    {
        if (HttpContext.Current.Request.QueryString["href"] != null)
        {
            string href = HttpContext.Current.Request.QueryString["href"];
            HttpCookie c = new HttpCookie("CurrentRoute", href);
            c.Expires = DateTime.Now.AddHours(1);
            HttpContext.Current.Response.Cookies.Add(c);

            HttpContext.Current.Response.ContentType = "application/json";
            HttpContext.Current.Response.Write("{\"status\":\"ok\"}");

        }
    }

创建cookie并成功回调后,我们通过javascript重新加载页面。 在默认的Page_Load事件中,我们加载了适当的用户控件:

protected void Page_Load(object sender, EventArgs e)
    {
        #region process route

        if (HttpContext.Current.Request.Cookies["CurrentRoute"] != null)
        {
            var route = HttpContext.Current.Request.Cookies["CurrentRoute"].Value.ToString();
            string pageName = GetPageName(route);
            Placeholder1.Controls.Add(LoadControl("/ctrls/" + pageName + ".ascx"));
        }
        else
        {
            Placeholder1.Controls.Add(LoadControl("/ctrls/default.ascx"));
        }

        #endregion

    }

    public string GetPageName(string href)
    {
        int index = href.IndexOf("&");
        if (index == -1)
            return href.Trim('/');
        else
        {
            return href.Substring(0, index).Trim('/');
        }
    }

我在git上创建了示例代码: HideRoute

答案 5 :(得分:1)

您应该使用Server.Transfer方法 例如,default.aspx中有asp.net按钮 写事件点击这样:

 Server.Transfer("/login.aspx?q1=testQuery");

使用此方法您的网址不会更改,在login.aspx中,您可以获得查询字符串