ASP MVC 重定向而不改变 URL(路由)

问题描述 投票:0回答:5

目标: 我希望能够输入 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,但将信息发送到操作并让它显示其结果。

c# asp.net asp.net-mvc url-routing
5个回答
5
投票

我同意 Nick 的观点,尽管我认为你可以只使用常规视图,而不必执行部分视图。如果它们不在与控制器对应的视图中,您可能需要将它们实现为共享视图(因为它只会在关联视图和共享视图中查找)。

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

然后,每个视图都会采用模型的特定实例并使用该模型渲染其内容。 网址不会改变。

每当您使用 RedirectResult 时,您实际上都会向浏览器发送 HTTP 重定向,这将强制 URL 更改。


4
投票

我不确定你是否尝试过这种方式或者这种方式是否有任何缺点..

将 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 进行设置。

希望有帮助...


2
投票

您可以像这样更改控制器:

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

然后你可以在你的视图中使用这些ViewBag,如下所示:

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

就是这样。您可以使用类和一些函数来改进这个示例。


0
投票

您是说您想去“www.mysite.com/NewYork”,然后“真的”去“其他地方”但保留网址吗? 也许您想要做的是使用部分视图来实现这一点? 这样,您的基页将被路由到,然后在该页面内进行条件测试以显示不同的部分视图? 我已经在我的应用程序中完成了此操作,用于查看网格的只读版本或可编辑网格。 效果非常好。


0
投票

我不确定您可以对重定向到 .aspx 页面做什么,但您应该能够将

RedirectToAction(...)
替换为如下内容:

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

}
© www.soinside.com 2019 - 2024. All rights reserved.