Как удалить ненужную информацию из удобного URL-адреса, прежде чем он перейдет к действию контроллера - PullRequest
5 голосов
/ 21 октября 2010

Мы пытаемся использовать пользовательские маршруты в приложении ASP.NET MVC для генерации этого URL: 'http://example.com/Person/unnecessaryinfo-42'. «Ненужная информация» - это имя идентификатора, который сделает URL доступным для взлома для пользователя. Ниже приведен код нашей карты маршрутов. Это работает, но в результате действия моего контроллера в параметре id указывается "лишняя информация-42". Могу ли я удалить «лишнюю информацию-» до того, как она достигнет действия контроллера?

routes.MapRoute("person_id", "person/{id}",
    new { controller = "Customer", action = "Details" },
    new { id = @"unnecessaryinfo-\d" });

Edit:

Вот наш последний код:

routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}",
    new { controller = "Customer", action = "Details" },
    new { id = @"[\d]{1,6}" });

В главе «Маршрутизация из ASP.NET MVC 2 в действии» (стр. 234) обсуждается, по возможности, избегать использования идентификаторов базы данных, но, если необходимо, добавьте дополнительную информацию, чтобы сделать URL читаемым. Это то, что мы пытаемся (безуспешно) сделать. Идентификатор базы данных в настоящее время составляет от 1 до 6 цифр (и может расти со временем).

Ответы [ 2 ]

5 голосов
/ 22 октября 2010

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

routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}",
    new { controller = "Customer", action = "Details" },
    new { id = @"[\d]{1,6}" });

Переключение порядка, в котороммаршруты, добавленные в RouteCollection, должны решить проблему.Более конкретные маршруты должны быть первыми добавлены в коллекцию.Например, если у вас также есть этот маршрут:

routes.MapRoute("person_login", "person/{id}",
    new { controller = "Customer", action = "Details" });

Он должен появиться после вашего более конкретного маршрута "person_id", чтобы ваш код выглядел следующим образом:

routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}",
    new { controller = "Customer", action = "Details" },
    new { id = @"[\d]{1,6}" });

routes.MapRoute("person_login", "person/{id}",
    new { controller = "Customer", action = "Details" });

URL, который вы указали'http://example.com/Person/unnecessaryinfo-42' будет соответствовать обоим маршрутам, но так как ваш более конкретный маршрут появляется первым, именно этот маршрут будет использоваться.Когда сопоставляется менее конкретный URL-адрес, он не будет соответствовать первому, и поэтому будет использоваться второй маршрут.

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

Решение Стивена, вероятно, является лучшим для долгосрочного использования, но Фил определеннолегче реализовать для отладки и грязной отладки.Я бы начал с изменения порядка маршрутов, но если это не решит проблему, воспользуйтесь одним из вышеупомянутых отладчиков.

3 голосов
/ 21 октября 2010
routes.MapRoute(
    "person_id", 
    "person/{unnecessaryinfo}-{id}",
    new { controller = "Customer", action = "Details" },
    new { id = @"\d" }
);

Вы также можете добавить ограничение регулярных выражений в маркер маршрута unnecessaryinfo.

...