Строка маршрута добавлена ​​в Redirect.Response, но не назначена строке [RouteData]

У меня есть кнопка, которая использует метод кода для выполнения вещи. После завершения у меня есть Redirect.Response, который должен переслать пользователя и использовать строку данных маршрута, чтобы получить все продукты, соответствующие ему.

Вместо этого он перенаправляет пользователя на целевой URL ([domain]/ScreeningDateTime/a38eceeb-5753-4156-ae2d-6a74cf7fef1e-64722426), но отображает все результаты из этой таблицы, а не только результаты, соответствующие строке RouteData.

Я хотел бы отметить несколько вещей: я могу ввести [домен]/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;
    }

Если бы искал исправление дольше, чем я хотел бы признать. Любая помощь будет принята с благодарностью.:)

Спасибо

1 ответ

Я всегда обращался к переменным маршрута в .aspx.cs как Page.RouteData.Values[variableName], Попробуйте этот код:

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;
}

ОБНОВИТЬ:

Мне интересно, если вы используете что-то вроде FriendlyURL или перезаписи URL, и это вызывает конфликт между /ScreeningDateTime.aspx а также /ScreeningDateTime/, Попробуйте переименовать URL-адрес маршрута во что-то еще, например:

routes.MapPageRoute(
        "ScreeningsByDateTimeRoute",
        "ScreeningDateTimeIntId/{internalId}",
        "~/ScreeningDateTime.aspx"
        );
Другие вопросы по тегам