2010-02-26 9 views
14

J'ai une grande demande existante construite sur ASP.NET MVC2 RC2.Comment spécifier zone par défaut sans ajouter zone = « » à chaque ActionLink

Tous mes liens ressemblent à ceci: htp // site/contrôleur/action/id

Je viens d'ajouter une zone appelée: bigbird.

Maintenant, quand je suis dans la région bigbird, tous mes liens ressembler à ceci: htp: // site/bigbird/contrôleur/action/id

Le problème est qu'aucun de ces contrôleurs/actions exister dans ma nouvelle zone. Je dois donc passer par tous mes ActionLinks partout dans ma demande et de mettre cette routevalue: zone = String.Empty

Y at-il moyen de contourner cela?

Répondre

12

Je ne sais pas de loin autour si vous utilisez les méthodes standard MVC (autres que les remplaçant peut-être d'appeler votre propre version), mais si vous utilisez le ActionLink<TController> ou d'autres méthodes génériques fournies dans la bibliothèque MvcFutures, alors vous pouvez.

La méthode MvcFutures appelle ExpressionHelper.GetRouteValuesFromExpression(), qui recherche un ActionLinkAreaAttribute sur le contrôleur pour déterminer la zone. Ainsi, vous pouvez décorer vos contrôleurs dans votre principale « zone » comme suit:

[ActionLinkArea("")] 
[HandleError] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Les liens d'action devraient être générés en utilisant correctement la syntaxe standard:

<%= Html.ActionLink<HomeController>(c => c.Index(), "Home") %> 
+0

Merci pour la réponse. C'est exactement ce que j'ai fini par faire mais je n'ai pas encerclé pour le poster. – iamwill

+0

Haha ici, j'ajoute une Html.AreaActionLink stupide ... alors j'ai vu le RouteValueDictionary GetRouteValuesFromExpression et je me demandais quel est ce ActionLinkAreaAttribute! Google et atterri ici bon travail: P – superlogical

+0

Salut, mais lorsque nous utilisons cet attribut de zone - [ActionLinkArea ("")] et essayez d'utiliser Html.BuildUrlFromExpression (x => Index()), nous obtenons toujours htp: // site/BigBird/controller/action/id zone dans l'URL ... –

0

Vous pouvez faire une des deux choses. Vous pouvez déplacer/copier vos contrôleurs/actions dans la zone appropriée ou écrire de nouveaux contrôleurs pour la nouvelle zone (ce qui est l'approche que je recommande), ou vous pouvez écrire une route personnalisée qui force la nouvelle zone à la racine (que je ne pas recommander, car elle va à l'encontre du but de domaines ayant):

routes.MapRoute(
    "BigBird_Override",            
    "BigBird/{controller}/{action}/{id}",       
    new { area = String.Empty } 
); 
+1

Mon explication n'a pas été très claire. Je ajouté mes contrôleurs bigbird/modèles/vues sur la zone bigbird. Mais la masterpage qui couvre à la fois la zone et le site principal, montre BigBird dans tous les liens vers le site principal. Donc, ce que je dois faire, c'est ajouter {Area = ""} à tous mes appels ActionLink. D'après ce que je peux dire à la source MVC est qu'il infère la zone en fonction de la zone que vous êtes. Il ne détermine pas qu'un contrôleur est pas dans une zone, et celui-ci ajoute de manière incorrecte bigbird aux liens qui aren » t dans la BigBird Area ... ils ne se trouvent dans aucune zone. – iamwill