2012-01-07 19 views
0

私は既存のasp.netアプリケーションでルーティングを行う必要があります - asp.net mvcではありません(私は変換するはずですが、 ):)私に教えていない - どのように私は私が見るすべてのサンプルコードとして通常のクラスの代わりに、aspxページへのルーティング行うことができ、ここのようなaspxページに常にある:正確にaspxページではないクラスへの純粋なASP.NETルーティング

http://msdn.microsoft.com/en-us/magazine/dd347546.aspx

、私はMVC Controllerルーティングのように少ししたい:コントローラーは、あなたがアクセスする純粋なクラスですhttp://domain.com/product

+0

クラスには? App_Code/YourClass.csと同じですか? – justinlabenne

+0

いいえMVC Controllerルーティングのようにしたいと考えています。コントローラーの例製品はhttp://domain.com/productを通じてアクセスする純粋なクラスです – user310291

+0

純粋なクラスとは何ですか?コントローラはSystem.Web.Mvc.Controllerを継承し、WebフォームはSystem.Web.UI.Pageを継承します。どちらもクラスで、最初のものは純粋なものにし、2番目のものはそうではないものにします。 –

答えて

5

ASP.NET MVCとASP .NET Webフォームは、その中で同じルーティングインフラストラクチャを共有する両方のフレームワークは、最終的にHTTPリクエストを処理するためにIHttpHandlerを考え出す必要があります。

IHttpHandlerインターフェイスが 初めからASP.NETの一部となっており、 Webフォーム(System.Web.UI.Page)はIHttpHandlerです。要求のさらなる処理のため

(質問にリンクMSDNの記事から)ASP.NET MVCで

System.Web.Mvc.MvcHandlerクラスが使用され、which then delegates to a controller。 ASP.NET Webフォームでは通常、.aspxファイルを表すSystem.Web.UI.Pageクラスが使用されますが、純粋なIHttpHandler .ashxファイルに関連付けられたものも使用できます。

.aspx Webフォームページの代わりに.ashxハンドラにルーティングすることができます。どちらもIHttpHandlerMvcHandlerと同じ)を実装していますが、前者はそれだけです。これは、(ルーテッド)リクエストを処理する「純粋なクラス」に近づけることができます。ハンドラ部分は単なるインタフェースなので、自分のクラスから自由に継承することができます。

<%@ WebHandler Language="C#" Class="LightweightHandler" %> 

using System.Web; 

public class LightweightHandler : YourBaseClass, IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
    context.Response.ContentType = "text/plain"; 
    context.Response.Write("Hello world!"); 
    } 

    public bool IsReusable { get { return false; } } 
} 

IRouteHandlerがちょうどIHttpHandlerのインスタンスを返す必要があることに注意してください:

public IHttpHandler GetHttpHandler(RequestContext requestContext); 

あなたは.ashxファイルを使用する場合は、* BuildManagerを使用して、あなたのハンドラをインスタンス化するために、いくつかのフープを介してジャンプする必要があるかもしれません。そうでない場合、あなたはあなたのクラスのちょうど新しいインスタンスをすることができますし、それを返す:

public IHttpHandler GetHttpHandler(RequestContext requestContext) 
{ 
    // In case of an .ashx file, otherwise just new up an instance of a class here 
    IHttpHandler handler = 
    BuildManager.CreateInstanceFromVirtualPath(path, typeof(IHttpHandler)) as IHttpHandler; 

    // Cast to your base class in order to make it work for you 
    YourBaseClass instance = handler as YourBaseClass; 
    instance.Setting = 42; 
    instance.DoWork(); 

    // But return it as an IHttpHandler still, as it needs to do ProcessRequest 
    return handler; 
} 

は純粋IHttpHandlersのルーティングはるかに詳細な分析のために、この質問への回答を参照してください:Can ASP.NET Routing be used to create “clean” URLs for .ashx (IHttpHander) handlers?

** I BuildManagerの例について完全には分からない人は、その部分が間違っていると私を修正してください。*

+0

ありがとうございます。しかし、なぜ公式の医者が何かを使うことができると言われて以来、私は.ashxを使う義務があります。私はMVCコントローラのルーティングのようにしたい:コントローラーの例製品は、http://domain.com/product – user310291

+0

@ user310291経由でアクセスする純粋なクラスです。ルーティング*をMVC *のようにしたい場合は、 MVCに切り替えると、Webformsでこれを行うことはできません。 –

+0

私が言ったように、ASP.NET MVCに切り替えることはできません.Net 3.5以降でルーティングがサポートされているのはなぜですか? – user310291

2

ASP.NET MVCに切り替えられず、.ashxハンドラが要件を満たさない場合、ナンシーを見たい、 'lightweight web framework'。

はここで導入から例です(前の段落内のリンクを参照してください):

public class Module : NancyModule 
{ 
    public Module() : base("/foo") 
    { 
    Get["/"] = parameters => { 
     return "This is the site route"; 
    }; 

    Delete["/product/{id}"] = parameters => { 
     return string.Concat("You requested that the following product should be deleted: ", parameters.id); 
    }; 
    } 
} 

このクラスは、/ fooと/ fooの/製品/ 42への要求を処理します。このフレームワークでビューを使用して、より複雑な(HTML)応答をレンダリングすることもできます。

+0

ここでフレームワークを使用することはできません。 – user310291

2

3.5から4.0に更新できる場合、WebFormsはより適切なルーティングをサポートします。

void Application_Start(object sender, EventArgs e) 
{ 
    RouteTable.Routes.MapPageRoute("default", string.Empty, "~/default.aspx");  
} 

私は本当に「純粋なクラス」の部分を理解していないが、うまくいけば4.0に更新する、これはあなたが軌道に乗ることができますオプションの場合:Global.asaxのでは、あなただけのこのようなものを行う必要があります。

関連する問題