ASP MVC Redirect без изменения URL (маршрутизация) - PullRequest
6 голосов
/ 15 апреля 2009

Цель: Я хочу, чтобы можно было набрать URL: www.mysite.com/NewYork ИЛИ www.mysite.com/name-of-business

В зависимости от строки, я хочу направить на различные действия без изменения URL.

Пока у меня есть:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapRoute(
        "UrlRouter", // Route name 
        "{query}", // URL with parameters 
        new { controller = "Routing", action = "TestRouting" } // Parameter defaults
    );
}

В контроллере у меня есть:

public ActionResult TestRouting(string query)
{
    if (query == "NewYork")
        return RedirectToAction("Index", "Availability");    // <--------- not sure
    else if (query == "name-of-business")
        return Redirect("nameofbusines.aspx?id=2731");       // <--------- not sure
    else
        return RedirectToAction("TestTabs", "Test");         // <--------- not sure
}

Я почти все перепробовал, чтобы перенаправить / перенести на страницу без изменив URL, но все, что я пробовал, меняет URL или выдает ошибку.

В основном я ищу эквивалент server.transfer, где я могу сохранить URL-адрес, но отправить информацию для действия и сделать так, чтобы он отображал его результат.

Ответы [ 5 ]

5 голосов
/ 15 апреля 2009

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

public ActionResult TestRouting(string query)
{
    if (query == "NewYork")
    {
        var model = ...somehow get "New York" model
        return View("Index", model );
    }
    else if (query == "name-of-business")
    {
        var model = ...get "nameofbusiness" model
        return View("Details", model );
    }
    else
    {
        return View("TestTabs");
    }
}

Каждое представление затем берет конкретный экземпляр модели и отображает его содержимое с использованием модели. URL не изменится.

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

2 голосов
/ 29 июня 2014

Вы можете изменить свой контроллер следующим образом:

public ActionResult TestRouting(string query)
{
    string controller,action;

    if (query == "NewYork")
    {
        controller = "Availability";
        action = "Index";
    }
    else
    {
        controller = "Test";
        action = "TestTabs";
    }

    ViewBag.controller = controller;
    ViewBag.action = action;

    return View();
}

Тогда вы можете использовать эти ViewBags в вашем представлении следующим образом:

@{
    Layout = null;
    Html.RenderAction(ViewBag.action, ViewBag.controller);
}

Вот и все. И вы можете улучшить этот пример, используя класс и некоторые функции.

1 голос
/ 22 июня 2010

Я не уверен, пытались ли вы таким образом или у этого способа есть какие-либо недостатки ..

Добавьте файл global.asax в ваш проект. В это добавить следующий метод:

void Application_BeginRequest(object sender, EventArgs e)
{
    // Handles all incoming requests
    string strURLrequested = Context.Request.Url.ToString();
    GetURLToRedirect objUrlToRedirect = new GetURLToRedirect(strURLrequested); 
    Context.RewritePath(objUrlToRedirect.RedirectURL);
}

GetURLToRedirect может быть классом, который имеет логику для поиска фактического URL-адреса на основе введенного URL-адреса. Свойство [RedirectURL] будет установлено с URL-адресом для перенаправления ниже листов.

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

0 голосов
/ 15 апреля 2009

Я не уверен, что вы можете сделать с перенаправлением на страницу .aspx, но вы должны иметь возможность заменить RedirectToAction(...)s на что-то вроде этого:

public ActionResult TestRouting(string query)
{
    if (query == "NewYork") 
    {
        var controller = new AvailabilityController();        
        return controller.Index();
    }
    else if (query == "name-of-business")
        return Redirect("nameofbusines.aspx?id=2731");       <--------- not sure
    else 
    {
        var controller = new TestController();        
        return controller.TestTabs();
    }

}
0 голосов
/ 15 апреля 2009

Вы говорите, что хотите перейти на «www.mysite.com/NewYork», а затем «действительно» перейти «куда-нибудь еще», но оставить URL-адрес в покое? Возможно, что вы хотели бы сделать, это использовать частичные представления для реализации этого? Таким образом, ваша базовая страница будет направлена ​​на то, на что вы будете перенаправлены, и затем внутри этой страницы вы проводите тестирование условий, чтобы вызвать различные частичные просмотры? Я сделал это в своем приложении для просмотра либо только для чтения версии сетки, либо редактируемой сетки. Это сработало очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...