2010-10-13 16 views
5

¿Hay alguna manera de hacer que los parámetros de este método de extensión sean "inteligibles" desde mi punto de vista?Ayuda del método de extensión LINQ II

Por el momento, puedo obtener una información sobre herramientas de los parámetros (en el método de acción del controlador), pero me encantaría con confianza IntelliSense escriba los nombres de los parámetros para 'seguridad'. De todos modos, sin más preámbulos, el método, seguido por el uso:

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

Uso (donde FundShareholderController es mi controlador y x.JsFile() es un método de acción al respecto.):

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

Espero que esto tenga sentido . Avíseme si hay detalles faltantes que necesita para ayudar.

BTW: cualquier consejo de optimización se acepta con mucho gusto también.

+0

Yo no lo entiendo, de su ejemplo qué parámetros es lo que quieres intellisensed, y dónde los valores vengo? – Iain

+0

hi iain - los parámetros provendrían de la acción genérica Expression >. es decir, podría 'señalar' una acción llamada GetStuff (int id, nombre de cadena) y el intellisense debería activarse en esos nombres de parámetros. en realidad, desde que escribí esto, logré que funcione, por lo que actualizaré el ejemplo en algún momento. –

Respuesta

5

Intente agregar los comentarios XML sobre el método como el siguiente.

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

Después de poner los comentarios anteriores sobre el método de extensión, puedo verlos en el IntelliSense. Ver la imagen a continuación.

intellisense

+0

de hecho, esa es una buena sugerencia +1 –

+0

considere marcarla como respuesta si la ayudó. gracias :) –

+1

Hola zain, te di el +1, pero no responde completamente a mis requisitos, por lo que en este momento no lo marcaré como respuesta definitiva. pero de nuevo, gracias por la entrada;) –

Cuestiones relacionadas