2010-10-13 8 views
5

Czy istnieje sposób, aby parametry tej metody rozszerzenia "intellisensible" z mojego widoku?Metoda rozszerzenia LINQ pomoc szukana II

W tej chwili mogę uzyskać podpowiedź dotyczącą tego, jakie parametry (w metodzie działania kontrolera) są, ale z pewnością chcielibyśmy, aby IntelliSense wpisał nazwy parametrów dla "bezpieczeństwa". W każdym razie, bez zbędnych ceregieli, metody, a następnie wykorzystania:

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; 
} 

użytkowania (gdzie FundShareholderController jest mój kontroler i x.JsFile() jest nim sposób działania.):

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

Mam nadzieję, że to ma sens . Daj mi znać, jeśli brakuje jakichkolwiek szczegółów, które musisz wesprzeć.

BTW - wszelkie wskazówki optymalizacyjne są chętnie przyjmowane również na pokładzie.

+0

ja nie rozumiem z Twojej przykład jakie parametry Chcesz intellisensed, i gdzie wartości pochodzą? – Iain

+0

hi iain - parametry pochodzą z ogólnej akcji Expression >. tzn. mogę "wskazać" działanie o nazwie GetStuff (int id, nazwa ciągu), a intellisense powinno włączyć te nazwy parametrów. Właściwie, od napisania tego, udało mi się sprawić, że działa, więc w pewnym momencie zaktualizuje ten przykład. –

Odpowiedz

5

Spróbuj dodać komentarze XML do metody podobnej do poniższej.

/// <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> 

Po dodaniu powyższych uwag do metody rozszerzenia widzę je w IntelliSense. Zobacz zdjęcie poniżej.

intellisense

+0

w rzeczywistości jest to dobra sugestia, aby +1 –

+0

oznaczało to jako odpowiedź, jeśli pomogło. dzięki :) –

+1

Cześć zain, dałem ci +1, ale to nie w pełni odpowiada na moje wymaganie, więc w tej chwili nie oznaczę go jako ostatecznej odpowiedzi. ale znowu, dziękuję za wejście;) –

Powiązane problemy