2012-03-01 27 views
6

私はASP.NET MVC3 + WebFormsを使用してレポートをレンダリングするための簡単なレポートWebアプリケーションを構築しています。レポート自体はReportViewer ASP.NET WebFormsコントロールによってレンダリングされますが、ASP.NET MVCを使用してパラメータエントリを作成します。ASP.NET MVC + WebForms - ルートコンフリクト

~/Reportのリクエストを除いて、すべてのリクエストがデフォルトのルーティングスキーム「〜/ {controller}/{action}/{parameters}」に従うようにしたいと思います。これを行う正しい方法は何ですか?デフォルトの1とWebフォームページのための1 - ビットを拡大

..

私はGlobal.asax.csに2つのルートを持っています。

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
    ); 

    routes.MapPageRoute("report-rendering", "Report", "~/Render.aspx"); 
} 

URLは(ReportControllerIndexメソッドを呼び出そうとし~/Report?id=7すなわち、微細化、これに伴う問題は、リクエストが来たときに、最初のルートは、第2の1のURLを食べることになってしまいます存在しない)。そのように「報告・レンダリング」ルートは、「デフォルト」のルートの前に来るように、私はそれを変更した場合

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapPageRoute("report-rendering", "Report", "~/Render.aspx"); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
    ); 
} 

今すぐHtml.ActionLink(の呼び出し)間違ったURLをレンダリングするには、すなわち

`@Html.ActionLink("Report list", "Index", "ReportList")` 

は加えながら

`http://localhost:49910/Report?action=Index&controller=ReportList` 

私の現在の回避策は、最初の 'デフォルト' のルートを置くレンダリング次のように 'Report'コントローラのリクエストを無視するための正規表現の制約:

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
    new { controller = @"(?!report$).*" } 
); 

これはきれいではありません。繰り返しますが、これを行う正しい方法は何ですか?

また、パラメータをレンダリングフォームに渡す方法はまだ決めていません。クエリパラメータを使用するか、POSTすることができます。私は、クエリのパラメータがより柔軟であると推測しています。ここでベストプラクティスは何ですか?

EDIT:

@LeftyXで答えを研究している間、私は答えを見つけたように、思えます。 URLを生成するときに、すべてのルートと ため使っ名は常にルート名を使用して...

Professional ASP.NET MVC 3(名前付きルート、第9章、233ページ)での彼のルーティングの章からP.ハークを引用します。たいていの場合、URLを生成するために使用したい ルートを並べ替えることをルーティングに任せることは、実際には偶然に任せています。これは、強盗のコントロールフリークの開発者とよく似ています。 URLを生成するときは、一般的には にリンクするルートを知っているので、名前で指定することもできます。

上記のセクションでは、私が説明したものと非常に似た状況について説明します。

しかし、Html.ActionLink()にはルート名パラメータで過負荷がないので、このようなルートがあればアプリケーション全体のどこでも確実に使用できませんか?

答えて

1

これは私が理解した最良の解決策です。
使用するルートを指定することができますので、私は(私がレポートというフォルダの下に私のレポートページを入れている)

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapPageRoute(
      "report-rendering", 
      "Report/{id}", 
      "~/Reports/Report.aspx" 
     ); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 
} 

私はRouteLinkを使用して、私のリンクを作成したMapPageRouteと私のルートを登録しました:

@Html.RouteLink("Report list", "report-rendering", new { id = 7 }) 

と私はこのように私のWebフォームページにIDを取得することができます:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var id = Page.RouteData.Values["id"] as string; 
} 

希望します。

UPDATE

私はあなたの人生を容易にするために拡張メソッドを作成しました:

public static class ExtensionMethods 
{ 
    public static MvcHtmlString WebFormActionLink(this HtmlHelper htmlHelper, string linkText, string ruoteName, object routeValues) 
    { 
     var helper = new UrlHelper(htmlHelper.ViewContext.RequestContext); 

     var anchor = new TagBuilder("a"); 
     anchor.Attributes["href"] = helper.RouteUrl(routeName, routeValues); 
     anchor.SetInnerText(linkText); 
     return MvcHtmlString.Create(anchor.ToString()); 
    } 
} 

は最高のは、ActionLinkの代わりのWebFormActionLinkを使用することであっただろうが、私は持っています署名に関する問題と私はこれに関する専門家ではない。

+0

ご回答ありがとうございます。あなたがそこで何をしたかわかる。 {id}パラメータを追加したため、{id}の値を指定せずに.RouteLink()呼び出しがルートに一致しなくなりました。 しかし、idパラメータを指定してルートを生成すると、このルートと一致します。 これは:http:// localhost:49910/Report/1?actionこの@Html.ActionLink( "ページ1"、 "ページ"、 "ホーム"、新しい{id = 1}、null) = Page&controller = Home これはあなたが期待するものではありませんか? –

+0

@ghostskunks:私は知っています。 WebForms用のリンクを生成するためにRouteLinkを使用する必要があるか、ActionLinkを拡張しようとする可能性があります。 – LeftyX

+0

@ghostskunks:私は何かをまとめようとしましたが(答えを更新しました)、私が言ったように、私は専門家ではありません。それは単なるアイデアです。 – LeftyX

関連する問題