2017-12-28 35 views
0

Der Code funktioniert, ist aber albern.Anhängen von Hash/Fragment an RedirectResult führt zu umständlichem Code

Wenn die Ansicht an den Benutzer zurückgegeben wird, scrollt die Seite zum Anker CompanyId.

Dumme ist, dass ich eine andere öffentlichen Aktion mit einem anderen Route (ohne ‚Begriffe‘) zu belichten habe

I/terms/CompanyID umleiten will, aber dann bekomme ich eine ambigiousAction Ausnahme, dass diese Aktion mit gleichen Routen existiert bereits ...

Wie löst man dieses Dilemma wenn möglich nicht die erste Route zu ändern?

[HttpGet("~/terms/{companyId}")] 
public IActionResult Home(string companyId}) 
{ 
    string url = Url.Action(nameof(HomeForRedirect), new { companyId}) + "#conditions"; 
    return new RedirectResult(url); 
} 

[HttpGet("{companyId}")] 
public IActionResult HomeForRedirect(string companyId) 
{ 
    Viewbag.CompanyId = companyId; 
    return View(nameof(Home)); 
} 
+1

Der Hash ist in der Regel eine Clientseite Sache. Ich denke, es sollte in dem Link vorhanden sein, auf den du klickst, um dorthin zu gelangen und nicht im HomeController eingestellt zu sein. –

+0

Danke ich total vergessen, dass es wirklich funktioniert und war so auf die Hash-Server-Seite angehängt, weil ich viele Beiträge darüber auf SO fand und dachte, dass es eine Lösung sein muss, aber eigentlich eine umständliche Lösung :-), danke! – Pascal

Antwort

1

Wenn ich Ihren Code bin verstehen, wollen Sie im Wesentlichen die URL /terms/{companyId}-/{controller}/{companyId}#conditions zu umleiten? Der einfachste Weg wäre, beide Routen an die gleiche Aktion anzuhängen und die Weiterleitung in einer Bedingung auszuführen. Etwas wie:

[HttpGet("{companyId}", Order = 1)] 
[HttpGet("~/terms/{companyId}", Order = 2)] 
public IActionResult Home(string companyId) 
{ 
    if (Context.Request.Path.StartsWith("/terms")) 
    { 
     var url = Url.Action(nameof(Home), new { companyId }) + "#conditions"; 
     return Redirect(url); 
    } 

    ViewBag.CompanyId = companyId; 
    return View(); 
} 

Eine noch bessere Methode wäre einfach die Umleitung direkt in IIS zu tun. Es gibt eine nicht unbeträchtliche Menge an Verarbeitung, die erforderlich ist, um eine Anfrage in ASP.NET Core-Maschinen zu behandeln, und es ist völlig verschwendete Mühe, einfach umzuleiten. Verwenden Sie das URL-Rewrite-Modul in IIS, um Ihre Weiterleitung für diese URL einzurichten, und Ihre Anwendung muss sich dann überhaupt nicht darum kümmern. Sie haben nur Ihre normale Home Aktion, die eine Ansicht zurückgibt, und alles wird einfach funktionieren.

Einige andere Hinweise, da es scheint, wie Sie diese neu sind:

  • Es ist besser, eher das Route Attribut zu verwenden, als die spezifischere HttpGet usw. Die Standard-GET ist.
  • Geben Sie die Controller-Methoden wie Redirect anstelle von Instanzen von IActionResult (d. H. new RedirectResult(...)) zurück.
  • Standardmäßig wird eine Ansicht mit demselben Namen wie die Aktion zurückgegeben. Angenommen, Ihre Aktion ist Home, können Sie einfach return View() statt return View(nameof(Home)) tun.
+0

danke für die Tipps, aber bitte beachten Sie meine obigen Kommentar. Du hast so viel geschrieben, dass ich deine Antwort auffrischen muss Oder ich habe ein schlechtes Gefühl ;-) – Pascal