ASP.NET MVC Удалить строку запроса в методе действий

У меня есть метод действий, который выглядит так:

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

Что произойдет, так как URL-адрес запроса будет выглядеть следующим образом:

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

Но я хочу, чтобы он выглядел просто

www.mysite.com/controller/

Есть ли способ удалить строку запроса внутри метода action?

Ответ 1

Нет, если вы не используете метод POST, информация должна каким-то образом пройти. Альтернативой может быть использование промежуточного класса.

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

Или. если вы просто использовали 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();
}

Ответ 2

Я не уверен, что ты действительно об этом думаешь. Если вы удалите строку запроса... тогда вы удалите строку запроса.. то есть ваша страница не будет иметь значение строки запроса, чтобы делать все, что нужно.

Там есть куча разных хаков. Все они не идеальны. Вы можете использовать javascript для выделения строки запроса. Вы можете перенаправить на страницу без запроса без настройки переменной сеанса.. все это довольно уродливо.

Помните, что то, что пользователь видит в адресной строке, находится на клиенте. Клиент контролирует это. Вы можете играть с ним через javascript, но делать это, как правило, плохая идея. Так как скрытие вещей от пользователя можно считать вредоносным поведением.

Ответ 3

Посмотрите маршруты. Они определяют, как будет записываться URL с параметрами.

Если вы создаете новое приложение MVC и смотрите файл Global.asax.cs в разделе "RegisterRoutes()). вы должны увидеть одну запись.

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

Посмотрите на каждую часть:

  • "По умолчанию" - это имя. Это просто должно быть уникальным для каждого создаваемого вами маршрута.
  • "{controller}/{action}/{id}" - это шаблон, который вы хотите использовать. example.org/home/index?id=2 будет записано example.org/home/index/2 вместо
  • new {controller = "home", action = "index", id = UrlParameter.Optional} определяет значения по умолчанию, если ничего не указано.

Итак, этот маршрут делает это так, если вы перейдете на example.org, предположим, что вы имеете в виду example.org/home/index{id необязательно}.

Работая с этим, вы можете начать понимать, как создавать свои собственные маршруты.

Теперь, отвечая на ваш вопрос, короткий ответ - да, вы могли бы сделать URL-адрес похожим, но не действительно. Вам нужно будет определить маршрут с сообщением по умолчанию, и он будет выглядеть только так, если кто-то не указал сообщение. Вы должны сообщить контроллеру, что такое сообщение. Извините, но лучшее, что вы можете сделать, это определить маршрут, который дает вам

/message/Hello%20World и используя string.replace, сделайте это еще приятнее ``/message/hello_world '

Ответ 4

Я рекомендую использовать слизню. Отправляй сообщение: Сообщение SOF Slug В предыдущих приложениях я использовал этот подход для удаления запросов с URL-адреса.

Ответ 5

Вы можете удалить строку запроса, добавив немного JavaScript в виде бритвы.

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

Если вы перейдете на страницу

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

Тогда это покажет

www.mysite.com/controller/

в браузере.

Большинство современных браузеров поддерживают это (поддержка браузера).