2012-01-07 97 views
0

我需要在現有的asp.net應用程序中進行路由 - 而不是一個asp.net mvc(是的,我知道我應該轉換,但讓我們說現在是不可能的不要告訴我:)) - 我該怎麼做路由到正常類,而不是一個aspx頁面,因爲所有的示例代碼我看到的是總是與aspx頁面喜歡這裏:純粹的ASP.NET路由到一個類而不是aspx頁面

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

精確,我想要做一點MVC控制器路由:控制器例如產品是一個純類,您可以通過訪問http://domain.com/product

+0

要上課嗎?就像在App_Code/YourClass.cs中一樣? – justinlabenne 2012-01-07 21:39:31

+0

不,我想在MVC控制器路由中這樣做:例如產品的控制器是一個純粹的類,您可以通過http://domain.com/product – user310291 2012-01-07 22:17:33

+0

訪問什麼是純類?控制器從System.Web.Mvc.Controller繼承,而Web Form從System.Web.UI.Page繼承。兩者都是類,什麼使得第一個純粹的和第二個不是? – 2012-01-08 00:08:42

回答

5

ASP.NET MVC和ASP .NET Web窗體共享相同的路由基礎設施中,這兩個框架最終需要拿出一個IHttpHandler來處理HTTP請求:

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類,但也可以使用與.ashx文件關聯的IHttpHandler

因此,您可以路由到.ashx處理程序,作爲.aspx Web窗體頁面的替代方法。兩者都實現IHttpHandler(如MvcHandler),但與前者完全相同。這就和你處理(路由)請求的'純粹類'一樣。由於處理程序部分只是一個接口,所以您可以自由地繼承自己的類。

<%@ 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); 

您可能需要通過一些跳鐵圈使用實例化處理程序的BuildManager如果使用.ashx的文件*。如果沒有,你可以只新你的類的實例並返回它:

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?

**我'不完全確定BuildManager的例子,有人請糾正我,如果我得到那部分錯誤*

+0

謝謝,但仍然爲什麼我會被迫使用.ashx,因爲官方文檔提到我可以使用任何東西。我想在MVC Controller路由中這樣做:例如,產品的控制器是一個純粹的類,您可以通過http://domain.com/product – user310291 2012-01-07 22:19:08

+0

@ user310291訪問:如果您想要路由*類似於MVC *,那麼您需要切換到MVC ....你不能在Webforms中做到這一點。 – 2012-01-07 22:26:28

+0

正如我所說,我不能切換到ASP.NET MVC,從.NET 3.5開始支持路由,爲什麼我不能這樣做? – user310291 2012-01-07 23:08:45

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和/富/產品/ 42。您也可以使用此框架的視圖來呈現更復雜的(HTML)響應。

+0

不能在這裏使用任何框架,只有.NET本身,所以我的問題:) – user310291 2012-01-08 12:01:43

2

如果您可以從3.5更新到4.0,WebForms支持更好的路由。在Global.asax中,你只需要做這樣的事情:

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

我真的不明白「純A類」的一部分,但希望如果更新到4.0是一個選項,這可以讓你去。