2010-10-21 4 views
0

Je voulais ajouter une méthode d'extension à la classe HtmlHelper afin que les développeurs puissent récupérer génériquement et AreaActionLink<T> sans avoir à ajouter le new { area = "MyArea" } à chaque fois, sans avoir à spécifier un Controller. Tout cela fonctionne très bien si je spécifie l'espace de noms ou mets l'espace de noms du contrôleur de zone dans le Web.config. Par exemple, si je change l'espace de noms du contrôleur de zone en My.Web.Controllers plutôt qu'en My.Web.MyArea.Controllers, il lance un 404 mais si j'utilise l'espace de noms, il se résout correctement.AreaActionLink Extension Méthode et bug d'espace de noms?

public static MvcHtmlString AreaActionLink<T>(this HtmlHelper helper, string linkText, string actionName, object routeValues, object htmlAttributes) where T : IController 
{ 
    RouteValueDictionary routes = new RouteValueDictionary(routeValues); 
    string area = typeof(T).GetArea(); 
    if (!routes.ContainsKey("area")) 
     routes.Add("area", area); 

    return helper.ActionLink(linkText, 
     actionName, 
     typeof(T).Name.Replace("Controller", string.Empty), 
     routes, 
     htmlAttributes as Dictionary<string, object>); 
} 

Cela fonctionne si l'espace de noms est qualifié lors de l'appel AreaActionLink

namespace My.Web.Areas.MyArea.Controllers 
{ 
    [Area("MyArea")] 
    public class OtherPlaceController : Controller 
    { 
     //... 
    } 
} 

et appelé comme ceci:

<%=Html.AreaActionLink<OtherPlaceController>("Link Text", "MyAction")%> 

mais si je tente d'aplatir la hiérarchie des espaces de noms, donc je n » Je dois ajouter un nouvel espace de nom pour toujours Area il jette un 404.

namespace My.Web.Controllers 
{ 
    [Area("MyArea")] 
    public class OtherPlaceController : Controller 
    { 
     //... 
    } 
} 

Il semble que la partie .Areas de l'espace de noms est important, mais je ne peux pas comprendre pourquoi ...

Répondre

1

Comme je suis sûr que vous avez pris l'habitude de, par défaut ASP.NET MVC est très dépend beaucoup de la structure du répertoire (les contrôleurs doivent être dans le dossier "Contrôleurs", les vues dans "Vues", etc.) C'est juste plus pareil. Vos zones devrait être être dans des dossiers séparés - c'est en fait l'une des principales raisons de les avoir! :)

+0

Oui, mes zones sont dans des sous-dossiers de la racine mais j'essayais d'obtenir des espaces de noms plats afin que je n'ai pas besoin de qualifier complètement l'espace de noms lorsque j'appelais ma méthode d'extension ou que je devais ajouter web.config. Je suppose que c'est une chose une seule fois donc ce n'est pas * trop * mauvais. – hunter