2009-04-15 194 views
6

目标: 我希望能够输入网址:www.mysite.com/NewYork或www.mysite.com/name-of-businessASP MVC重定向而不更改URL(路由)

根据字符串我想在不更改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,但一切我试着改变网址或给我一个错误。

基本上我正在寻找相当于server.transfer的地方,我可以保留这个URL但发送信息给动作并显示它的结果。

+0

我实际上能够想出我正在寻找的东西。 它有点复杂,但一旦你建立起来,你几乎可以在飞行中创建路线。 我很快就会发布我的答案,这个项目很粗糙! – CesarHerrera 2009-05-01 22:43:08

回答

0

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

+0

我想要做的是让www.mysite.com/NewYork和www.mysite.com/BusinessName采取不同的行动。 一个处理地点,另一个处理业务。 但同时保持URL不变。 – CesarHerrera 2009-04-15 18:31:47

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

然后,每个视图将采用模型的特定实例并使用该模型呈现其内容。该网址不会更改。

无论何时您使用RedirectResult,您实际上都会向浏览器发送HTTP重定向,并强制进行URL更改。

+0

我想我看到你在这里说什么,基本上使视图共享并返回视图并通过模型传递视图信息。 这可能是可行的,但令人遗憾的是,我吮吸并没有使用模型,我通过ViewData传递了一些东西。 这似乎是可行的,但如果我找不到任何其他answe – CesarHerrera 2009-04-15 19:01:09

+0

我希望能找到一个答案使用路由,所以我可以调用参数的行动,使他们可以做的工作,但这可能会捏合。 – CesarHerrera 2009-04-15 19:05:40

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

} 
0

林不知道,如果你想这或者如果这种方式有任何缺点..

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

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

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

就是这样。你可以用一个类和一些函数来改进这个例子。