2016-07-13 9 views
0

Ich benutze ASP.NET MVC mit AngularJs-Framework. In meiner Heimat Controller Ich überprüfe, ob es eine gültige Lizenz ist, und wenn nicht, ich bin wieder lenk auf einer Seite Lizenz mit diesem Code zu importieren:Erkennen von Redirect auf eine andere URL

public ActionResult Index() 
 
     { 
 
      var retVal = _licenseProvider.ValidateExistingLicense(); 
 

 
      if (!retVal.Item1) 
 
      {     
 
       Response.Redirect("DataMaintenance/ImportLicenses", true); 
 
       return View("DataMaintenance/ImportLicenses"); 
 
      }

Also, Mein ImportLicenses-Controller Ich möchte erkennen, dass ich umgeleitet wurde oder aus dem Menü aufgerufen wurde. Ich habe einen älteren Thread über die Umleitung zu einer anderen Aktion gefunden, aber diese Lösung trifft nicht zu. Was sind meine Möglichkeiten hier?

+1

Darf ich fragen, warum Sie Response.Redirect anstelle von Response.RedirectToAction verwenden? –

+0

Weil es ein anderer Controller in einer anderen Aread ist – Naomi

+1

Sie können RedirectToAction verwenden, um auch auf andere Bereiche umzuleiten: 'return RedirectToAction (" Index "," ImportLicenses ", neu {area =" DataMaintenance "}' –

Antwort

0

In der Zwischenzeit habe ich mich entschieden, ein bisschen zu betrügen, aber es hat funktioniert. Im Menü änderte ich den ursprünglichen Aufruf dieser

dataMaintNodes.SubNodes.Add(new MenuMapNode() { LabelKey = "importLicense", Action = "ImportLicenses", Controller = "ImportLicenses", Area = "DataMaintenance", Icon = "", Roles = "IMPORTLIC" });

Mit anderen Worten, anstelle der normalen Index Aktion führte ich eine andere Aktion. Ich habe diese neue Aktion zu meinem Controller hinzugefügt und die ViewBag-Eigenschaft auf false gesetzt, wenn sie aus dem Menü aufgerufen wurde, und auf true in der Index-Aktion, die von Redirect aufgerufen wird. Also, es ist ein Betrug, aber es funktioniert. Ich wollte nur die Abbrechen-Schaltfläche in diesem modalen Dialog anzeigen, wenn ich aus dem normalen Menü anrufe, und keine Cancel-Schaltfläche, wenn ich vom Heim-Controller aus anrufe. Nun, mein zweites Problem ist, dass Modal Dialog nicht wirklich daran hindert, davon zu entkommen und weiter mit der Anwendung zu arbeiten. Wir möchten vielleicht mehr Logik einführen.

1

Sie haben ein paar Optionen hier:

  1. hinzufügen Abfrage-String-Parameter in der Aktion ImportLicenses dass bestimmt, ob der Benutzer über eine Umleitung hier bekam oder das Menü

  2. Set ein TempData Variable, bevor Sie Ihren Benutzer an die Aktion ImportLicenses umleiten.

  3. Verwenden Sie eine Session Variable

Read this for more information about passing data between Action methods.

1

Es ist wirklich auf Ihre Zwänge abhängt, gibt es eine Reihe von Optionen. Ohne viel über dein Projekt zu wissen. Mein erster Vorschlag wäre, einen Cookie vor der Weiterleitung zu löschen. Wenn die Anfrage in die ImportLicenses-Aktion eintritt, können Sie nach der Überprüfung suchen und sie löschen, aber auch angeben, ob der Cookie in Ihrem Ansichtsmodell gefunden wurde oder nicht dies in der Benutzeroberfläche.

Es gibt andere Optionen wie Sitzungsstatus oder einen Abfragezeichenfolgenparameter. Ein Querystring-Parameter könnte genauso effektiv sein wie die Cookie-Idee, die ich oben erwähnt habe, und es wäre ein bisschen sauberer.

Wenn Sie weitere Informationen zu Ihrem Anwendungsfall angeben können, kann ich möglicherweise meine Antwort erweitern.

Hoffe, das hilft.

0

Ich habe gerade eine andere Lösung versucht, basierend auf den Kommentaren in diesem Thread und dem Thread, den ich vorher gesehen habe. Ich habe Response benutzt.RedirectToAction Methode (als Kommentar vorgeschlagen) und fügte ich diesen Code:

 protected override void OnActionExecuted(ActionExecutedContext filterContext) 
 
     { 
 
      ViewBag.needValidLicense = false; 
 
      if (filterContext.Result is RedirectResult) 
 
      { 
 
       ViewBag.needValidLicense = true; 
 
      } 
 

 
      base.OnActionExecuted(filterContext); 
 
     }

Dies ist jedoch nicht funktioniert, zum Beispiel Das Ergebnis wurde nicht als RedirectResult angezeigt. Ich werde zu der ursprünglichen Lösung zurückkehren, eine separate Aktion zu verwenden, wenn sie aus dem Menü aufgerufen wird.