6

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

4

5 回答 5

5

我和尼克一起做这个,虽然我认为你可以只使用常规视图而不是做部分视图。如果它们不在与控制器对应的视图中,您可能需要将它们实现为共享视图(因为它只会在关联和共享视图中查找)。

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 更改。

于 2009-04-15T18:11:36.363 回答
3

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

将 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 以重定向到工作表下方。

希望有帮助...

于 2010-06-22T10:58:16.447 回答
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();
}

然后你可以像这样在你的视图中使用这些 ViewBags:

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

而已。你可以通过使用一个类和一些函数来改进这个例子。

于 2014-06-29T12:08:50.757 回答
0

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

于 2009-04-15T17:57:09.110 回答
0

我不确定您可以对重定向到 .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();
    }

}
于 2009-04-15T18:13:24.237 回答