2012-03-05 38 views
5

Tôi khá mới mẻ với StackOverflow vì vậy hãy tha thứ cho bất kỳ dấu hiệu nào về sự thiếu hiểu biết của tôi. :)ASP.NET MVC C# Nhận tên bộ điều khiển và hành động trong lớp

Tôi có vấn đề hơi nhỏ với ứng dụng MVC trong Visual Studio 2010 (Bộ điều khiển được viết bằng C#). Tôi muốn tạo một phương thức tạo lịch sử hành động ứng dụng và cho mục đích đó tôi muốn lấy tên của bộ điều khiển và hành động được sử dụng mỗi lần. Thật không may, chữ cái đầu tiên của chuỗi chứa tên bộ điều khiển của tôi luôn bị thiếu. tôi đã sử dụng mã này:

string url = HttpContext.Current.Request.RawUrl; 
    RouteData route = RouteTable.Routes.GetRouteData(new OwnedContext(url)); 
    var values = route.Values; 
    string controllerName = values["controller"].ToString(); 
    string actionName = values["action"].ToString(); 

đâu OwnedContext được định nghĩa như thế này:

private class OwnedContext : HttpContextBase 
    { 
     private readonly HttpRequestBase mockHttpRequestBase; 

     public OwnedContext(string appRelativeUrl) 
     { 
      this.mockHttpRequestBase = new OwnedRequest(appRelativeUrl); 
     } 

     public override HttpRequestBase Request 
     { 
      get { return mockHttpRequestBase; } 
     } 
    } 

Tên hành động được lưu trữ một cách chính xác nhưng khi tôi gỡ lỗi mã này tôi thấy rằng chuỗi controllerName giữ tên của bộ điều khiển nhưng chữ cái đầu tiên (Capital) luôn bị thiếu, mặc dù chuỗi url chứa một giá trị với mẫu này:/controller/action.

Tôi sẽ đánh giá cao bất kỳ con trỏ, ví dụ mã hoặc giải thích lý do tại sao điều này xảy ra. Nếu mô tả của tôi không chính xác, hãy cho tôi biết, tôi sẽ cải thiện nó.

Cảm ơn trước :)

EDIT: GIẢI PHÁP FOUND:

Tìm thấy vấn đề (loại): Có điều gì đó sai trái với OwnedContext (được định nghĩa trong câu hỏi ban đầu của tôi). Lúc đầu, tôi sử dụng routeValueDictionary như HarHaHu gợi ý nhưng vấn đề ban đầu vẫn kiên trì, cho đến khi tôi đặt HttpContext như tham số GetRouteData của:

string url = HttpContext.Current.Request.RawUrl; 
    RouteData route = RouteTable.Routes.GetRouteData(httpContext); 
    UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContext, route)); 

    var routeValueDictionary = urlHelper.RequestContext.RouteData.Values; 
    string controllerName = routeValueDictionary["controller"].ToString(); 
    string actionName = routeValueDictionary["action"].ToString(); 

đâu HttpContext có một getter tùy chỉnh:

public new HttpContextBase httpContext 
    { 
     get 
     { 
      HttpContextWrapper context = 
       new HttpContextWrapper(System.Web.HttpContext.Current); 
      return (HttpContextBase)context; 
     } 
    } 

Bằng cách này tôi bỏ qua OwnedContext và cuối cùng đã có tên đầy đủ của bộ điều khiển của tôi (ví dụ: Đồ nội thất và không phải là đồ nội thất).

Cảm ơn các mẹo. :) Hy vọng điều này sẽ giúp ai đó. Chúc may mắn!

+0

Bất kỳ cơ hội nào đăng các định nghĩa tuyến đường của bạn từ global.asax? Rõ ràng một cái gì đó đang được dịch sai từ URL ro tuyến đường. – Dave

+0

global.asax của tôi chứa các tuyến mặc định được tạo bằng mẫu ứng dụng MVC3 –

Trả lời

4
var routeValueDictionary = urlHelper.RequestContext.RouteData.Values; 

sử dụng tính năng này với ngữ cảnh tùy chỉnh của bạn.

Các vấn đề liên quan