Asp.net mvc 2 et RenderAction<> générique

J’ai déjà expliqué ici le peu d’interet que j’accorde aux “magic strings” qui sont souvent sources de bugs, depuis la nouvelle version d’asp.net mvc 2 pour faire du rendu partiel, il n’y à plus besoin d’utiliser les excellentes méthodes de MVCContrib car une nouvelle méthode permet le rendu

Html.RenderAction(ActionName, ControllerName, routeValues);

mais les paramètres ActionName et ControllerName sont de type string , dans le cas d’une refactorisation du nom d’une action ou d’un controlleur , il y a danger. pour éviter ça voici une méthode générique qui permet d’appeler les méthodes du controlleur choisi pour le rendu partiel :

1 public static void RenderAction<T>(this HtmlHelper helper, Expression<Action<T>> expression)
2 where T : Controller
3 {
4 var call = expression.Body as MethodCallExpression;
5 var controllerName = typeof(T).Name.Replace("Controller", string.Empty);
6 var actionName = call.Method.Name;
7
8 var parameters = call.Method.GetParameters();
9 var routeValues = new RouteValueDictionary();
10 if (parameters.Length > 0)
11 {
12 for (int i = 0; i < parameters.Length; i++)
13 {
14 var parameter = call.Arguments[i];
15 object value = null;
16 var constantExpression = parameter as ConstantExpression;
17 if (constantExpression != null)
18 {
19 value = constantExpression.Value;
20 }
21 else
22 {
23 var body = Expression.Convert(parameter, typeof(object));
24 var exp = Expression.Lambda<Func<object>>(body, new ParameterExpression[0]);
25 value = exp.Compile()();
26 }
27 routeValues.Add(parameters[i].Name, value);
28 }
29 }
30 helper.RenderAction(actionName, controllerName, routeValues);
31 }


exemple :


Html.RenderAction<AccountController>(c => c.PartialLoginBox(“login.ascx”));



Bien sur ceci est au détriment de la performance, mais on gagne en robustesse de code.

1 commentaire:

Anonyme a dit…

The properties leaves, what that