2009-04-15 31 views
6

目標URLを変更せずに:によってwww.mysite.com/NewYork OR www.mysite.com/name-of-businessASP MVCリダイレクト(ルーティング)

:私はURLを入力することができるようにしたい string 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を変更しようとしましたが、エラーが出ます。

基本的に私はURLを保持できるが、アクションに情報を送り、その結果を表示できるserver.transferと同等のものを探しています。

+0

私は実際に私が探していたものを正確に思いつくことができました。 少し複雑ですが、一度設定すれば、その場でルートを作成できます。 すぐに私の答えを掲載します、このプロジェクトは大まかです! – CesarHerrera

答えて

0

「www.mysite.com/NewYork」に行き、「本当に」「別の場所」に行きたいが、URLだけを残していますか?おそらくあなたがしたいと思うことは、これを実装するために部分的なビューを使うことでしょうか?そうすれば、あなたの基本ページはどこに送られるのでしょうか?そのページの中で、あなたは条件テストをして、異なる部分的なビューを表示しますか?私は、読み取り専用バージョンのグリッドまたは編集可能なグリッドを表示するための私のアプリケーションでそれを行っています。それは非常にうまくいった。

+0

私は何をしたいのですか?www.mysite.com/NewYorkとwww.mysite.com/BusinessNameを持っていて、別の行動を取ることです。 場所を扱うものと、ビジネスを扱うものがあります。 ただし、URLはそのまま維持してください。 – CesarHerrera

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

各ビューは、モデルの特定のインスタンスを取り、そのモデルを使用してコンテンツをレンダリングします。 URLは変更されません。

RedirectResultを使用すると、実際にはブラウザにHTTPリダイレクトが送信され、強制的にURLが変更されます。

+0

私はあなたがここで何を言っているかを見て、基本的にビューを共有し、ビューを返し、ビュー情報をモデルを通して渡すと思う。 これはおそらく実行可能ですが、残念ながら私は吸うとモデルを使用していない、私はViewDataを介していくつかのものを渡す。 他の回答が見つからない場合は – CesarHerrera

+0

私はルーティングを使用して回答を見つけることを望んでいたので、作業を行うことができるようにパラメータでアクションを呼び出すことができますが、これはピンチで動作する可能性があります。 – CesarHerrera

+0

ああ、また、共有でより多くのビューを作成する必要がない方法を見つけることを望んでいました。 – CesarHerrera

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

返事をありがとうが、悲しいことに: var controller = new TestController(); return controller.TestTabs(); does notは、実際のアクションを呼び出していますが、表示したいビュー結果を返していません。 私はビューを表示するには何ができるのだろうか? – CesarHerrera

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

を。そして、クラスといくつかの関数を使ってこの例を改善することができます。

関連する問題