【问题标题】:Is it possible to use query strings in URL routing in a webforms application是否可以在 webforms 应用程序的 URL 路由中使用查询字符串
【发布时间】:2017-05-02 12:45:22
【问题描述】:

我有一个包含几个基本页面的 Web 表单应用程序。我创建了路由以确保这些页面最后不需要 .aspx。

routes.MapPageRoute("About", "About", "~/About.aspx");
routes.MapPageRoute("Contact", "Contact", "~/Contact.aspx");
routes.MapPageRoute("faq", "faq", "~/faqs.aspx");
routes.MapPageRoute("Donation", "Donation", "~/Donation.aspx");

我有一个 sql server 数据库,其中包含有关我们所持有的事件的数据。该表包含简单的值,例如 eventID、位置、日期、我们的目标等。

目前我的数据库中也只有一个,所以我刚刚创建了一个带有事件名称的新 aspx 页面。所以网址看起来像这样https://example.com/awesome-event

我添加了适当的路线

routes.MapPageRoute("Awesome-Event", "Awesome-Event", "~/Awesome-Event.aspx");

这很好用,但我希望能够添加新事件,而不必担心每次都添加新的 aspx 页面。我想我可以为此使用 URL 重写。我想要实现的是拥有一个传递查询字符串但保持漂亮 URL 的单个 .aspx 页面。

所以我所做的是创建一个名为 event.aspx 的新 aspx 页面

routes.MapPageRoute("Awesome-Event1", "Awesome-Event1", "~/event.aspx?id=1");
routes.MapPageRoute("Awesome-Event2", "Awesome-Event2", "~/event.aspx?id=2");

在我的 event.aspx 页面后面的代码中看起来像这样

protected void Page_Load(object sender, EventArgs e)
{
    string query = Request.QueryString["id"];
    if(query != null)
    {
        PageLable.Text = query.ToString();
    }
}

所以当前输入http://localhost:51197/Awesome-Event1http://localhost:51197/Awesome-Event2 都将我带到event.aspx 页面(我可以判断,因为我遇到了断点),但它实际上并没有传递ID 的查询字符串。

我这样做是否正确?有没有更好的解决方案。据我了解,MVC 使这种事情变得容易,但我并没有太多经验。数据库已经设置好了,我的项目是一个 webforms 应用程序,所以我什至不知道是否可以将 MVC 添加到我当前的项目中。

【问题讨论】:

  • 我的建议是,为工作使用正确的工具。这正是 MVC 旨在处理的场景。当您弄清楚如何将其应用于现有项目时,您可以遵循 ASP.NET MVC 中的初学者教程之一并启动并运行它,从而为您在未来节省大量维护难题。您可以针对现有数据库构建 MVC 解决方案,只需搜索“ASP.NET MVC 数据库优先”
  • @Daniel 路由在 web 表单中非常好(路由只是 MVC 的一小部分)——甚至还有一个 in-depth MSDN article about it。 onTheInternet - 我现在没有时间给出完整的答案,但是仔细阅读那篇文章,您应该能够使用路由参数。
  • 我只会构建我的 URL 更像 https://example.com/events/awesome。看起来更干净。

标签: c# asp.net webforms


【解决方案1】:

查看 MapPageRoute() 文档:

https://msdn.microsoft.com/en-us/library/system.web.routing.routecollection.mappageroute.aspx

有这个例子:

routes.MapPageRoute("SalesSummaryRoute",
    "SalesReportSummary/{locale}", "~/sales.aspx");

您可以像这样适应您的活动页面:

routes.MapPageRoute("Awesome-Event",
    "Awesome-Event/{id}/", "~/event.aspx");

这将允许您使用这样的网址:

https://example.com/Awesome-Event/2/

然后你可以像这样在 event.apsx 页面中看到要呈现的事件:

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.RouteData.Values["id"] != null)
    {
        int eventID = Convert.ToInt32(Page.RouteData.Values["id"]);
    }
}

如果你想变得花哨,你可以这样做:

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.RouteData.Values["id"] != null)
    {
        int eventID;
        if (int.TryParse(Page.RouteData.Values["id"], out eventID))
        {
           //render event based on numeric ID
        }
        else
        {
           //lookup event based on a string title. Then you could use a url like:
           //https://example.com/Awesome-Event/SuperbowlLII
        }
    }
}

但要小心,如果您允许 ID 和标题都引用数据信息,或者您可以有效地将内容的搜索引擎排名拆分到两个页面。您需要在 html 中指定一个规范的 url,这样只有一个事件的可能地址才能获得搜索引擎的所有信任。

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 2013-06-22
    • 2012-06-01
    • 2011-10-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多