Как использовать маршрутизацию ASP.NET 4 WebForms с Query String? - PullRequest
7 голосов
/ 08 февраля 2011

Во-первых, это не MVC, только веб-формы.

Я использую маршрутизацию, чтобы мой сайт был обратно совместим с нашими клиентами, а мой проект организован.

Я также подумываю переместить зашифрованную строку запроса на более понятный URL. Как это работает, наши клиенты должны пометить огромную зашифрованную ссылку, чтобы они не могли угадать других наших клиентов путем изменения идентификатора.

Но вместо того, чтобы иметь этот огромный URL-адрес, мы хотели добавить маршрут, такой как LoginClientName.aspx для каждого клиента, и иметь зашифрованную строку запроса, жестко запрограммированную или, возможно, в базе данных.

Но не вижу способа добавить запрос в MapPageRoute ..

Думал о чем-то вроде этого (знаю, это не работает)

routes.MapPageRoute("MapClient1", "LoginClient1.aspx", "Login.aspx?secure=mylongquerystring");
routes.MapPageRoute("MapClient2", "LoginClient2.aspx", "Login.aspx?secure=differentmylongquerystring");

Теперь это вызывает исключение, поскольку не позволяет? в URL .. есть идеи, как этого добиться? или это невозможно?

Ответы [ 2 ]

6 голосов
/ 09 февраля 2011

взгляните на это:
http://msdn.microsoft.com/en-us/library/cc668177.aspx

в основном то, что говорится:

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(RouteTable.Routes);
}


а затем:

void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("",
        "SalesReport/{locale}/{year}/{*queryvalues}", "~/sales.aspx");

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

    routes.MapPageRoute("SalesDetailRoute",
        "SalesReportDetail/{locale}/{year}/{*queryvalues}", "~/sales.aspx",
        false);

...

    routes.MapPageRoute("ExpenseDetailRoute",
        "ExpenseReportDetail/{locale}/{year}/{*queryvalues}", "~/expenses.aspx",
        false,
        new RouteValueDictionary 
            { { "locale", "US" }, { "year", DateTime.Now.Year.ToString() } },
        new RouteValueDictionary 
            { { "locale", "[a-z]{2}" }, { "year", @"\d{4}" } },
        new RouteValueDictionary 
            { { "account", "1234" }, { "subaccount", "5678" } });
}
3 голосов
/ 09 февраля 2011

Значит ли это, что вам придется указывать каждый маршрут индивидуально для каждого клиента? (если да, вы могли бы всегда использовать web.config urlMapping для этого)

Вместо этого используйте имя клиента как часть маршрута, а затем используйте имя клиента для поиска вашей действительно длинной строки запроса

как то так:

routes.MapPageRoute("ClientLoginRoute","Login/{clientName}","~/forms/login.aspx")

и затем на странице login.aspx получите доступ к имени клиента и т. Д. И найдите длинную строку

String reallyLongQueryString = Magic.GetReallyLongQueryString(Page.RouteData.Values["clientName"]);

Dim reallyLongQueryString as String = Magic.GetReallyLongQueryString(Page.RouteData.Values("clientName"))

Здесь я предполагаю, что не имеет значения, если бы клиент знал имя другого клиента, так как он не знал бы детали входа (если это имеет смысл) ... так как ему все равно нужно было бы вводить учетные данные и т.д.

...