2011-09-04 5 views
5

Tôi đang phát triển tính năng nhóm trên ứng dụng asp.net. tôi muốn cung cấp cho người dùng truy cập trực tiếp đến nhóm, vì vậy tôi muốn các url đượcĐịnh tuyến URL trên ASP.net, cần lấy thông số từ url

www.<domain>.com/<groupname> 

tôi thực hiện URL Routing cho trường hợp này, nhưng vấn đề mà tôi muốn vượt qua các tên nhóm một trang asp như tham số , Làm thế nào tôi có thể làm điều đó?

đường dẫn thực tế là "~/Public/ViewGroup?group=<groupname>, cách lấy tên nhóm này và thêm nó vào đường dẫn ảo?

Cảm ơn

+0

Tôi đã thử nó, làm việc trên máy chủ của địa phương nhưng trong sản xuất không. –

+0

Nó hoạt động trên sản xuất; sau khi thêm chúng vào web.config

+0

Thêm cấu hình cuối cùng cộng với cấu hình trên hệ thống.web

Trả lời

5

Câu trả lời nhanh chóng là sử dụng:

routes.MapPageRoute(
    "groupname", 
    "{group}", 
    "~/public/viewgroup" 
); 

Và sau đó thay vì (hoặc cũng như) sử dụng querystring để trích xuất các giá trị trong ~/public/viewgroup mã, bạn sẽ thay trích xuất các groupname từ RouteData như sau.

ControllerContext.RouteData.Values["groupname"]; 

Tùy chọn khác là sử dụng mô-đun viết lại IIS.

<rewrite> 
    <rules> 
     <rule name="groupname"> 
      <match url="^([^/]*)$" /> 
      <action type="Rewrite" url="public/viewgroup?group={R:1}" /> 
     </rule> 
    </rules> 
</rewrite> 

Nếu bạn thực sự phải vượt qua giá trị như một giá trị mới querystring, và muốn sử dụng Routing, sau đó mọi thứ trở nên khó khăn. Bạn thực sự phải xác định một trình xử lý tùy chỉnh và viết lại đường dẫn để nối thêm các giá trị định tuyến vào querystring.

public class RouteWithQueryHandler : PageRouteHandler 
{ 
    public RouteWithQueryHandler(string virtualPath, bool checkPhysicalUrlAccess) 
     : base(virtualPath, checkPhysicalUrlAccess) 
    { 
    } 

    public RouteWithQueryHandler(string virtualPath) 
     :base(virtualPath) 
    { 
    } 

    public override IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     var request = requestContext.HttpContext.Request; 
     var query = HttpUtility.ParseQueryString(request.Url.Query); 
     foreach (var keyPair in requestContext.RouteData.Values) 
     { 
      query[HttpUtility.UrlEncode(keyPair.Key)] = HttpUtility.UrlEncode(
               Convert.ToString(keyPair.Value)); 
     } 
     var qs = string.Join("&", query); 
     requestContext.HttpContext.RewritePath(
          requestContext.HttpContext.Request.Path, null, qs); 
     return base.GetHttpHandler(requestContext); 
    } 
} 

này có thể được đăng ký như sau:

routes.Add("groupname", new Route("{groupname}/products.aspx",  
      new RouteWithQueryHandler("~/products.aspx", true))); 

Đó là khá nhiều công việc để tránh chỉ kéo giá trị ra các dữ liệu định tuyến.

+0

tôi đang sử dụng. net 3.5, vì vậy tôi đang sử dụng phương thức Map.add r outes.Add (new Route ("{groupname}", GroupRouteHandler mới ("~/Public/ViewGroup? group = {groupname}") )); nó đã cho tôi lỗi này: ~/Public/ViewGroup? Group = {groupname} 'không phải là đường dẫn ảo hợp lệ –

+0

Xin lỗi vì lỗi của tôi? không được phép, bạn có thể sử dụng quy tắc viết lại. – TheCodeKing

+0

Bạn có thể điều này với định tuyến là tốt, cố gắng tìm đúng sytnax. – TheCodeKing

0

Tham số kiểu đường dẫn ASP.NET MVC (tham số) có thể được truy cập trong bộ điều khiển C# như vậy. Đối số đường dẫn cần truy lục là "id" trả về giá trị "123".

MVC Routing

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { id = RouteParameter.Optional }); 
} 

//Test URL: http://localhost/MyProject/Test/GetMyId/123 

MyController.cs

public class TestController : Controller 
{ 
    public string GetMyId() 
    { 
     //ANSWER -> ControllerContext.RouteData.Values["id"] 
     return ControllerContext.RouteData.Values["id"].ToString(); 
    } 
}