¿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.
Yo no lo entiendo, de su ejemplo qué parámetros es lo que quieres intellisensed, y dónde los valores vengo? – Iain
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. –