2010-02-16 2 views
8

Dieser Code ist in der Masterseite:Set Standardbereich - Vermeidung von `, neue {area = ""}` auf jeden Link auf der Website

<li><a href="<%=Url.Action("Action", "Controller") %>">Main site link</a></li> 
<li><a href="<%=Url.Action("AreaAction", "AreaController", new {area = "Area"}) %>">Area link</a></li> 

Alle Links funktioniert gut, bis ich geh zum Area Link. Wenn ich dorthin gehe, funktionieren alle Routen des Hauptgebiets nicht.

Um dies zu beheben, dass ich diese verwenden:

<li><a href="<%=Url.Action("Action", "Controller", new {area = ""}) %>">Main site link</a></li> 

Meine Frage ist, gibt es eine Möglichkeit, , new {area = ""} auf jeden Link in der auf die Hauptseite zu vermeiden?

Es ist sehr ärgerlich, dies auf jedem Link auf der Website zu haben.

Antwort

10

URL-Aktionen beziehen sich auf den Speicherort der Verknüpfung. So teilt new {area = ""} dem Aufruf von Url.Action nicht mit, dass es keinen Bereich gibt, es teilt ihm mit, den -Stammbereich zu verwenden. Wenn Sie new {area = ""} vom Url.Action-Aufruf weglassen, wird versucht, eine URL für die angegebene Aktion innerhalb des angegebenen Controllers innerhalb des aktuellen Bereichs zu erstellen (die "Area" sind in Ihrem Fall).

Daher ist es unvermeidlich, wenn Sie von einem Teilbereich zum Wurzelbereich verknüpfen möchten.

3

Ich weiß immer noch nicht um es herum, wenn Sie die Standard-MVC-Methoden verwenden (außer möglicherweise überschreiben sie Ihre eigene Version aufrufen), aber wenn Sie die ActionLink<TController> oder andere generische Methoden in den MvcFutures verwenden Lib dann kannst du.

Die MvcFutures-Methoden rufen ExpressionHelper.GetRouteValuesFromExpression() auf, die auf dem Controller nach einem ActionLinkAreaAttribute sucht, um den Bereich zu bestimmen. So können Sie Ihre Controller in Ihrem Haupt "Bereich" schmücken sich wie folgt:

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

Die Aktion Links erzeugt werden sollte, richtig die Standard-Syntax:

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