ASP.NET MVC Удалить строку запроса в методе действия - PullRequest
13 голосов
/ 12 марта 2012

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

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/

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

Ответы [ 5 ]

20 голосов
/ 12 марта 2012

Нет, если вы не используете метод 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();
}
1 голос
/ 12 марта 2012

Просмотр маршрутов . Они определяют, как будет записан 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'

1 голос
/ 12 марта 2012

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

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

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

0 голосов
/ 02 мая 2019

Вы можете удалить строку запроса, добавив немного 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/

в браузере.

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

0 голосов
/ 30 марта 2016

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

...