5

Ich habe gerade eine MVC4 .NET 4.0-App auf meinem Web-Host für "Live" -Tests bereitgestellt. Nicht-Zielwege funktionieren gut, z.B. meinWas ist los mit meinem Bereich Routing in meiner bin MVC4-App?

@Html.ActionLink("Register as a Client", "Register", "Account", new { registrationType = "Client"}, null) 

Link funktioniert gut, und der Link öffnet die richtige Seite. Allerdings mit einem Link zu einem Bereich basierend Aktion wie folgt aus:

@Html.ActionLink("Authors", "Index", "Home", new { Area = "Author", registrationType = "Author" }, null) 

der Link tatsächlich an den Browser gerendert wird Aktion und Steuerung fehlt, dh

http://mylivedomain.com/?Area=Author&registrationType=Author 

Es kann sich lohnen, unter Hinweis darauf, dass die CSS-Bündelung Die Funktion von MVC4 funktionierte nach der Bereitstellung nicht mehr, und ich nutzte die klassischen Links zu einzelnen Stylesheets.

MAYBE RELATED: Meine Frage: Why is unmodified template code in my MVC4 app trying to register areas twice?

JUST IN: die Standardaktion aus der Umgebung Route Zuordnungen für den Standard rouite dieses Problem gelöst Entfernen. Zu Beginn gab es im VS2012-Vorlagencode keinen Standardcontroller.

+0

Haben Sie vergessen, am Ende Ihres ActionLink() ein 'neues {}' zu verwenden? http://stackoverflow.com/questions/2036305/how-to-specify-an-area-name-in--action-link –

+0

@NickDeVore, verwende ich eine 'null' stattdessen, und das funktioniert für Ich habe auf meinem Dev-Computer gearbeitet und zuvor auf der vorherigen MVC3-Version meiner Site, die ich implementiere, gearbeitet. – ProfK

+0

Klingt gut, ich hatte gerade diese andere Frage gefunden und die Antwort schien zu implizieren, dass es jetzt erforderlich war? Wie auch immer, nur ein Gedanke. –

Antwort

2

Versuchen Sie dies zu überprüfen.ControllerContext.RouteData.DataTokens ["Bereich"] in den Aktionsmethoden Ihrer Region.

Ich hatte eine Situation mit ähnlichen Problem, in dem der Bereich Name war einfach eine leere Zeichenfolge.

Das Festlegen des DataToken in der Aktionsmethode bietet möglicherweise eine schnelle Lösung, beantwortet jedoch nicht die Frage, warum MVC den Bereichsnamen nicht festlegt.

2

In Ihrem Fall, da Sie einen Bereich in der Abfragezeichenfolge angeben, sollten die Routen von Global.asax.cs gelten. Ich glaub du etwas davon haben es:

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ).DataTokens.Add("area","Author"); 
    } 

Dieser Code macht Home/Index Standardroute und überspringt Home/Index in url. Wenn Sie controller = "Home" auf etwas anderem ändern, zum Beispiel controller = "Home2", haben Sie den vollständigen Link für Home/Index und die neue Standardroute Home2/Index angezeigt. Ähnliches gilt für Standardrouten in Bereichen, wenn Sie sie angeben.

+0

Das explizite Hinzufügen des Daten-Tokens verursacht ein "Ein Element mit demselben Schlüssel wurde bereits hinzugefügt." Ausnahme. – ProfK

1

In Ihrem global.asax.cs sicherstellen, dass Sie diese Zeile haben in Ihrem Application_Start:

AreaRegistration.RegisterAllAreas(); 

In jedem Bereich, sollten Sie AreaRegistration.cs etwas wie diese:

public class testAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "test"; 
     } 
    } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "test_default", 
      "test/{controller}/{action}/{id}", 
      new { action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 
+1

Dieser Code wird automatisch als Teil der Projekt-/Artikelvorlagen hinzugefügt. – ProfK

1

Mit das @ Html.ActionLink

Verwendung dieses Format

@Html.ActionLink("Authors", "Index", "Home", new { Area = "Author", registrationType = "Author" }, new{}) 

Mein Problem gelöst.

0

Erben Sie PortableAreaRegistration von MvcContrib in einem Ihrer Bereiche zufällig?

Wir hatten genau die gleichen Symptome (funktioniert lokal, nicht auf dem Server), bis wir alle PortableAreaRegistrations aus den Portable Areas entfernt haben und einfach AreaRegistration verwenden, da MVC4 einen portablen Bereich ohne zusätzliche Bibliotheken registrieren kann.

+0

Ich verwende überhaupt nicht MvcContrib. – ProfK