ASP.NET MVC Remove query string in action method

Look into routes. They define how a url with parameters will be written.

If you create a new MVC application, and look at the Global.asax.cs file under `RegisterRoutes(). you should see one entry.

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

Look at each part:

  • "Default" is the name. This just has to be unique for each route you create.
  • "{controller}/{action}/{id}" is the pattern you want to use. example.org/home/index?id=2 will be written example.org/home/index/2 instead
  • new { controller = "home", action = "index", id = UrlParameter.Optional } is defining the defaults if nothing is specified.

So, that route make it so if you go to example.org it will assume you mean example.org/home/index{id is optional}.

Working from that, you can start to see how to create your own routes.

Now, addressing your question the short answer is yes you could make the URL look like that, but not really. You would have to define a route with a default message, and it would only look like that if someone didn't specify a message. You have to tell the controller what the message is. I'm sorry, but the best you can do is define a route that gives you

/message/Hello%20World and using string.replace make that look even nicer `'/message/hello_world'


No, unless you use a POST method, the information has to get passed somehow. An alternative may be to use an in-between class.

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

Or. if you simply used a 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();
}