web-dev-qa-db-fra.com

ASP.NET MVC Supprimer la chaîne de requête dans la méthode d'action

J'ai une méthode d'action qui ressemble à ceci:

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

Qu'est-ce qui se passe est que l'URL d'une demande à cela ressemblera à:

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

Mais je veux que ça ait l'air juste

www.mysite.com/controller/

Existe-t-il un moyen de supprimer la chaîne de requête dans la méthode action?

13
willvv

Non, sauf si vous utilisez une méthode POST, les informations doivent être transmises d'une manière ou d'une autre. Une alternative peut être d'utiliser une classe intermédiaire.

// 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();
}

Ou. si vous avez simplement utilisé un post

//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

Je ne suis pas sûr que vous y pensiez vraiment. Si vous supprimez la chaîne de requête ..., vous supprimez la chaîne de requête .., c’est-à-dire que votre page n’aura pas la valeur de chaîne de requête pour effectuer les tâches qui s’imposent.

Il y a un tas de trucs différents que vous pourriez faire ... tous ne sont pas idéaux. Vous pouvez utiliser javascript pour supprimer la chaîne de requête. Vous pouvez rediriger vers une page sans chaîne de requête après avoir défini une variable de session. Tout est plutôt moche.

N'oubliez pas que ce que l'utilisateur voit dans la barre d'adresse se trouve sur le client. Le client contrôle cela. Vous pouvez le manipuler via javascript, mais le faire est généralement une mauvaise idée. Cacher des choses à l'utilisateur peut être considéré comme un comportement semblable à un malware.

1
Erik Funkenbusch

Regardez dans routes . Ils définissent comment une URL avec des paramètres sera écrite.

Si vous créez une nouvelle application MVC, consultez le fichier Global.asax.cs sous `RegisterRoutes (). vous devriez voir une entrée.

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

Regardez chaque partie:

  • "Default" est le nom. Cela doit être unique pour chaque itinéraire que vous créez.
  • "{controller}/{action}/{id}" est le modèle que vous souhaitez utiliser. example.org/home/index?id=2 sera écrit example.org/home/index/2 à la place
  • new {controller = "home", action = "index", id = UrlParameter.Optional} définit les valeurs par défaut si rien n'est spécifié.

Ainsi, si vous accédez à example.org, cette route suppose que vous voulez dire example.org/home/index{id est facultatif}.

À partir de là, vous pouvez commencer à voir comment créer vos propres itinéraires.

Maintenant, pour répondre à votre question, la réponse courte est oui vous pouvez donner à l'URL l'apparence suivante, mais pas vraiment . Il vous faudrait définir un itinéraire avec un message par défaut, qui ne ressemblerait à cela que si quelqu'un ne spécifiait pas de message. Vous devez dire au contrôleur quel est le message. Je suis désolé, mais le mieux que vous puissiez faire est de définir un itinéraire qui vous donne

/message/Hello%20World et l'utilisation de string.replace rendent cette image encore plus agréable `'/ message/hello_world'

1
Joe

Je recommande d'utiliser une limace. Découvrez cet article: SOF Slug post Dans les applications précédentes, j’avais adopté cette approche pour supprimer les chaînes de requête de l’URL.

0
JoshYates1980