【问题标题】:Route String Added On Redirect.Response But Not Assigned To [RouteData] string路由字符串添加到 Redirect.Response 但未分配给 [RouteData] 字符串
【发布时间】:2014-09-20 20:29:00
【问题描述】:

我有一个按钮,它使用代码隐藏方法来做事。完成后,我有一个 Redirect.Response 应该转发用户并使用路由数据字符串来获取所有匹配它的产品。

相反,它会正确地将用户转发到目标 URL([域]/ScreeningDateTime/a38eceeb-5753-4156-ae2d-6a74cf7fef1e-64722426),但会显示该表中的所有结果,而不仅仅是与 RouteData 字符串匹配的结果.

我想说明几点: 我可以输入 [domain]/ScreeningDateTime?id=1 并让它正常工作。 在调试(VS2013.3Pro)中,如果我固定 InternalId,它会在初始页面上正确显示字符串“a38eceeb-5753-4156-ae2d-6a74cf7fef1e-64722426”。在 ScreeningDateTime 页面上,它没有。

为简洁起见删除了一些内容的代码(我已经对其进行了测试,因为它显示的结果相同):

从初始页面

Response.Redirect(
            GetRouteUrl("ScreeningsByDateTimeRoute", new { internalId = InternalId }));

来自 Global.asax

    void RegisterCustomRoutes(RouteCollection routes)
    {
        routes.MapPageRoute(
        "ScreeningsByDateTimeRoute",
        "ScreeningDateTime/{internalId}",
        "~/ScreeningDateTime.aspx"
        );

        *More Routes*

来自 ScreeningDateTime 后面的代码(目标页面):

    public IQueryable<Screening> GetProducts(
        [QueryString("id")] int? id,
        [RouteData] string internalId)
    {
        var _db = new ProductContext();
        IQueryable<Screening> query = _db.Screenings;

        if (id.HasValue && id>0)
        {
            query = query.Where(p => p.ScreeningID == id);
        }

        if (!String.IsNullOrEmpty(internalId))
        {
            query = query.Where(p =>String.Compare(p.InternalId,internalId) == 0);
        }
        return query;
    }

如果寻找修复的时间比我想承认的要长。任何帮助将不胜感激。 :)

谢谢

【问题讨论】:

    标签: c# asp.net webforms webforms-routing


    【解决方案1】:

    我总是以Page.RouteData.Values[variableName] 访问.aspx.cs 中的路由变量。试试这个代码:

    public IQueryable<Screening> GetProducts()
    {
        var _db = new ProductContext();
        IQueryable<Screening> query = _db.Screenings;
    
        if (!String.IsNullOrEmpty(Request.QueryString["id"]))
        {
            query = query.Where(p => p.ScreeningID == Request.QueryString["id"]);
        }
        else if (Page.RouteData.Values["internalId"] != null && !String.IsNullOrEmpty(Page.RouteData.Values["internalId"] as string))
        {
            query = query.Where(p => p.InternalId == Page.RouteData.Values["internalId"].ToString());
        }
        return query;
    }
    

    更新:

    我想知道您是否使用了 FriendlyURLs 或 URL 重写之类的东西,这会导致 /ScreeningDateTime.aspx/ScreeningDateTime/ 之间发生冲突。尝试将路由 URL 重命名为其他名称,例如:

    routes.MapPageRoute(
            "ScreeningsByDateTimeRoute",
            "ScreeningDateTimeIntId/{internalId}",
            "~/ScreeningDateTime.aspx"
            );
    

    【讨论】:

    • 感谢您的回复。试过没有成功。 InternalId 值仍显示为空。这似乎是我的路由问题,但我不确定。它被路由到正确的 URL,但是一旦到达那里,页面就不会将“ScreeningDateTime/{InternalId}”的“{InternalId}”部分分配给路由数据。就像那里一样,它只是被重置为空。
    • 如果该函数位于不同的类/库中,您能否尝试将该函数移到页面本身并查看它是否有效?
    • @ZombieBunnies 添加了有关潜在路由/url 冲突的更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 2010-10-09
    相关资源
    最近更新 更多