2010-10-13 32 views
5

Có cách nào để làm cho các thông số của phương pháp mở rộng này 'không thể nhận ra' từ chế độ xem của tôi không?Phương pháp mở rộng LINQ giúp tìm kiếm II

Hiện tại, tôi có thể nhận được chú giải công cụ về thông số (trong phương thức hành động của bộ điều khiển) nhưng rất muốn tự tin IntelliSense nhập tên tham số cho 'an toàn'. Dù sao, không có thêm ado, phương pháp này, tiếp theo là sử dụng:

public static string Script<T>(this HtmlHelper html, 
           Expression<Action<T>> action) where T:Controller 
{ 
    var call = action.Body as MethodCallExpression; 

    if (call != null) 
    { 
     // paramDic - to be used later for routevalues 
     var paramDic = new Dictionary<string, object>(); 
     string actionName = call.Method.Name; 
     var methodParams = call.Method.GetParameters(); 

     if (methodParams.Any()) 
     { 
      for (int index = 0; index < methodParams.Length; index++) 
      { 
       ParameterInfo parameterInfo = methodParams[index]; 
       Expression expression = call.Arguments[index]; 
       object objValue; 
       var expressionConst = expression as ConstantExpression; 
       if(expressionConst!=null) 
       { 
        objValue = expressionConst.Value; 
       } 
       else 
       { 
        Expression<Func<object>> expressionConstOther = 
         Expression.Lambda<Func<object>>(
          Expression.Convert(expression, typeof(object)), 
          new ParameterExpression[0]); 
        objValue = expressionConstOther.Compile()(); 
       } 
       paramDic.Add(parameterInfo.Name, objValue); 
      } 
     } 
     string controllerName = typeof(T).Name; 
     if (controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) 
     { 
      controllerName = controllerName.Remove(controllerName.Length - 10, 10); 
     } 

     var routeValues = new RouteValueDictionary(paramDic); 
     var urlHelper = new UrlHelper(html.ViewContext.RequestContext); 
     var url = urlHelper.Action(actionName, controllerName, routeValues); 

     const string linkFormat = "<script type=\"text/javascript\" src=\"{0}\"></script>"; 
     string link = string.Format(linkFormat, url); 

     return link; 
    } 
    return null; 
} 

sử dụng (nơi FundShareholderController là bộ điều khiển của tôi và x.JsFile() là một phương pháp hành động về việc này.):

<%=Html.Script<FundShareholderController>(x => x.JsFile("CreateInvestorBookingJsFile", 0))%> 

Tôi hy vọng điều này có ý nghĩa . Hãy cho tôi biết nếu có bất kỳ chi tiết nào còn thiếu mà bạn cần hỗ trợ.

BTW - mọi mẹo tối ưu hóa cũng sẵn sàng được đưa lên máy bay.

+0

Tôi không hiểu, ví dụ về thông số nào bạn muốn intellisensed và giá trị đến từ đâu? – Iain

+0

hi iain - các tham số sẽ đến từ hành động Expression >. tức là tôi có thể 'trỏ' vào một hành động được gọi là GetStuff (int id, tên chuỗi) và intellisense sẽ khởi động các tên tham số đó. thực sự, kể từ khi viết này, tôi đã quản lý để làm cho nó hoạt động, vì vậy sẽ cập nhật ví dụ tại một số điểm. –

Trả lời

5

Thử thêm nhận xét XML vào phương pháp như sau.

/// <summary> 
/// The summary of my Script Extension method. 
/// </summary> 
/// <typeparam name="T">T is the type of Controller</typeparam> 
/// <param name="html">The HTML helper.</param> 
/// <param name="action">The action Method of the Controller.</param> 
/// <returns></returns> 

Sau khi đưa các nhận xét trên về phương pháp mở rộng, tôi có thể thấy chúng trong IntelliSense. Xem hình ảnh bên dưới.

+0

thực sự, đó là một gợi ý tốt +1 –

+0

xem xét đánh dấu nó là câu trả lời nếu nó giúp. cảm ơn :) –

+1

hi zain, tôi đã cho bạn +1, nhưng nó không hoàn toàn trả lời yêu cầu của tôi, vì vậy sẽ không tại thời điểm đánh dấu nó như là câu trả lời dứt khoát. nhưng một lần nữa, cảm ơn cho đầu vào;) –

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