it-swarm.com.de

ASP.NET MVC Entfernen Sie die Abfragezeichenfolge in der Aktionsmethode

Ich habe eine Aktionsmethode, die so aussieht:

public ActionResult Index(string message)
{
  if (message != null)
  {
    ViewBag.Message = message;
  }
  return View();
}

Was passiert ist, dass die URL einer Anfrage dazu so aussieht:

www.mysite.com/controller/?message=Hello%20world

Aber ich möchte, dass es nur so aussieht

www.mysite.com/controller/

Gibt es eine Möglichkeit, die Abfragezeichenfolge in der Aktionsmethode zu entfernen?

13
willvv

Nein, es sei denn, Sie verwenden eine POST -Methode, die Informationen müssen irgendwie übergeben werden. Eine Alternative kann die Verwendung einer Zwischenklasse sein.

// this would work if you went to controller/SetMessage?message=hello%20world

public ActionResult SetMessage(string message)
{
  ViewBag.Message = message ?? "";
  return RedirectToAction("Index");
}

public ActionResult Index()
{
  ViewBag.Message = TempData["message"] != null ? TempData["message"] : "";
  return View();
}

Oder. wenn Sie einfach einen POST verwendet haben

//your view:
@using(Html.BeginForm())
{
    @Html.TextBox("message")
    <input type="submit" value="submit" />
}


[HttpGet]
public ActionResult Index()
{ return View(); }

[HttpPost]
public ActionResult Index(FormCollection form)
{
  ViewBag.Message = form["message"];
  return View();
}
20
naspinski

Ich bin mir nicht sicher, ob Sie das wirklich durchdenken. Wenn Sie die Abfragezeichenfolge entfernen, wird die Abfragezeichenfolge entfernt, dh Ihre Seite verfügt nicht über den Wert der Abfragezeichenfolge, um die erforderlichen Aktionen auszuführen.

Es gibt eine Menge verschiedener Hacks, die du machen könntest. Alle sind nicht ideal. Sie können Javascript verwenden, um die Abfragezeichenfolge zu entfernen. Sie können nach dem Festlegen einer Sitzungsvariablen zu einer Seite ohne Abfragezeichenfolge umleiten. Das ist alles ziemlich hässlich.

Denken Sie daran, dass sich das, was der Benutzer in der Adressleiste sieht, auf dem Client befindet. Der Client steuert das. Sie können per Javascript damit experimentieren, aber dies ist im Allgemeinen eine schlechte Idee. Da das Verbergen von Dingen vor dem Benutzer als Malware-ähnliches Verhalten angesehen werden kann.

1

Schauen Sie in Routen . Sie definieren, wie eine URL mit Parametern geschrieben wird.

Wenn Sie eine neue MVC-Anwendung erstellen, sehen Sie sich die Datei Global.asax.cs unter `RegisterRoutes () an. Sie sollten einen Eintrag sehen.

routes.MapRoute(
   "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "home", action = "index", id = UrlParameter.Optional } // Parameter defaults
        );

Schauen Sie sich jedes Teil an:

  • "Default" ist der Name. Dies muss nur für jede von Ihnen erstellte Route eindeutig sein.
  • "{controller}/{action}/{id}" ist das Muster, das Sie verwenden möchten. example.org/home/index?id=2 wird stattdessen example.org/home/index/2 geschrieben
  • new {controller = "home", action = "index", id = UrlParameter.Optional} definiert die Standardeinstellungen, wenn nichts angegeben ist.

Wenn Sie also zu example.org wechseln, wird davon ausgegangen, dass Sie example.org/home/index{id is optional} angeben.

Wenn Sie damit beginnen, können Sie sehen, wie Sie Ihre eigenen Routen erstellen.

Wenn Sie nun Ihre Frage beantworten, lautet die kurze Antwort yes. Sie könnten die URL so aussehen lassen, aber nicht wirklich . Sie müssten eine Route mit einer Standardnachricht definieren, und es würde nur so aussehen, wenn jemand keine Nachricht angibt. Sie müssen dem Controller mitteilen, um welche Nachricht es sich handelt. Es tut mir leid, aber das Beste, was Sie tun können, ist, eine Route zu definieren, die Sie gibt

/message/Hello%20World und string.replace machen das noch schöner `'/ message/hello_world'

1
Joe

Sie können die Abfragezeichenfolge entfernen, indem Sie der Rasiereransicht JavaScript hinzufügen.

@section scripts{
    <script>
        if (location.href.includes('?')) { 
            history.pushState({}, null, location.href.split('?')[0]); 
        }
    </script>    
}

Wenn Sie zur Seite navigieren

www.mysite.com/controller/?message=Hello%20world

Dann wird es zeigen

www.mysite.com/controller/

im Browser.

Die meisten modernen Browser unterstützen dies ( Browser-Unterstützung ).

0
Ohlin

Ich empfehle die Verwendung einer Schnecke. Schauen Sie sich diesen Beitrag an: SOF Slug post In früheren Anwendungen habe ich diesen Ansatz gewählt, um Querystringe aus der URL zu entfernen.

0
JoshYates1980