.NET MVC2 Как изменить параметры входящего URL - PullRequest
1 голос
/ 03 декабря 2010

Я использую .NET MVC 2 Если входящий запрос содержит URL:

http://something.com/1234

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

Новый URL-адрес должен выглядеть примерно так:

http://something.com/area/username/controller/action/id

, где в базе данных ищется исходный идентификатор (1234), и данные будут преобразовываться в определенный {имя пользователя} / {контроллер} / {action} / {id}.

У меня установлены следующие маршруты в классе AreaRegistration:

context.MapRoute(
    "route1",
    "area/{controller}/{action}/{id}",
    new { action = "Index", controller = "Home" },
    new string[] { "MyApp.Areas.Controllers" }
        );

context.MapRoute(
    "route2",
    "area/{controller}/{id}",
    new { action = "Index", controller = "Home" },
    new string[] { "MyApp.Areas.Controllers" }
);

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

Это мой первый пост SO, так что извините, если мой вопрос не ясен.Любые предложения приветствуются.

1 Ответ

1 голос
/ 03 декабря 2010

Вам необходимо вернуть RedirectToAction(), чтобы выполнить перезапись URL-адреса ...

return this.RedirectToAction(action, controller);

Существует целый ряд перегрузок для указания идентификаторов, значений маршрутов и т. Д. ...

Что касается поиска в базе данных, это будет зависеть от вашей модели доступа к данным.Предполагая Entity Framework или Linq, это будет что-то вроде:

DataClasses1DataContext dc = new DataClasses1DataContext();

var record = from a in dc.GetTable<Order>() select id, username;

Чтобы уточнить, как работает MVC ...

Я беру URL-адрес, такой как http://example.com/controller/action/id или http://example.com/area/controller/action/id

и вызывает соответствующий метод действия на указанном контроллере.Обычно вы возвращаете представление, однако вы можете отправить много специальных типов данных обратно для различных результатов, например, JSON Data, HTTP Redirects и т. Д.

Если в URL-адресе отсутствует область / контроллер / действие,используются значения по умолчанию для маршрута.

Итак ...

Если вы просто хотите отобразить соответствующую страницу, вы можете оставить URL-адрес как http://example.com/1234, пока действие / контроллер по умолчаниюимеет код для отображения соответствующего представления.

Если вы хотите изменить URL-адрес по эстетическим соображениям, у вас будет контроллер / действие по умолчанию, принимающее Id и возвращающее RedirectToAction, которое указывает на контроллер /Действие для нужного URL.

Стоит отметить, что он сгенерирует минимально возможный URL-адрес, поэтому, если на вашем контроллере по умолчанию будет 2 действия:

HomeController -> Index(int id)
HomeController -> ShowDetails(int id)

URL-адрес дляиндекс будет выглядеть примерно так:

http://example.com/1234

при перенаправлении на ShowDetails URL будет выглядеть следующим образом:

http://example.com/ShowDetails/1234

Если бы ShowDetails находился в другом элементе управления (не по умолчанию)иначе вы получите что-то вроде этого:

http://example.com/OtherController/1234

Это предполагает, что маршруты следуют стандартному формату /Controller/Action/Id.Само собой разумеется, регистрируя различные маршруты, он меняет параметры соответствующим образом.

Надеюсь, это поможет?

...