Сделайте так, чтобы параметр маршрута действительно отображался в адресной строке - PullRequest
1 голос
/ 30 октября 2011

У меня крошечное приложение в MVC 3.
В этом крошечном приложении я хочу, чтобы мои URL были четкими и последовательными.

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

Единственный маршрут такой:

routes.MapRoute(
  "Default",
  "{account}",
  new { controller = "Main", action = "Index", account = UrlParameter.Optional }
);

Это все работает нормально, но параметр account никогда не появляется в адресной строке как часть URL. Я могу вручную ввести test.com/some_account, и он будет работать, но кроме этого, account идет в качестве параметра записи и поэтому не отображается. И если я использую FormMethods.Get в своей форме, к URL добавляется ?account=whatever, что тоже не то, что я хочу, и это противоречит моему пониманию. Насколько я понимаю, инфраструктура MVC будет пытаться использовать параметры, установленные в маршруте, и только если не найдена, она добавит их после ?.

Я пробовал различные варианты настройки маршрутов - один маршрут с параметром по умолчанию или один маршрут с обязательным параметром, или два маршрута (один с обязательным параметром и один без параметров); Я пытался смешать HttpGet / HttpPost всеми возможными способами; Я пытался использовать метод одиночного действия с необязательным параметром string account = null и два метода действия (один с параметром, другой без), но я просто не могу отобразить этот элемент в URL.

Я также ознакомился с книгой Стивена Сандерсона о MVC 3, но на скриншотах также нет параметров (отображается страница сведений для Kayak, но URL-адрес в адресной строке htpp://localhost:XXXX/).

Единственное, что определенно работает и делает то, что я хочу, это

return RedirectToAction("Index", new { account = "whatever" });

Но чтобы сделать это, я должен сначала проверить необработанный входящий URL-адрес и не перенаправлять, если он уже содержит account, в противном случае это бесконечный цикл. Это кажется слишком странным и ненужным.

Как правильно сделать, чтобы account всегда отображался как часть URL?

1 Ответ

1 голос
/ 30 октября 2011

Насколько я понимаю, среда MVC будет пытаться использовать параметры, установленные в маршруте, и только если они не найдены, они будут добавлены их после?

Ваше понимание неверно. ASP.NET MVC ничего не добавляет. Это клиентский браузер, отправляющий отправку формы, как определено в HTML спецификации :

Атрибут method элемента FORM указывает используемый метод HTTP отправить форму обработчику. Этот атрибут может занять два Значения:

  • get: с помощью HTTP-метода «get» набор данных формы добавляется к URI, указанному атрибутом действия (с вопросительным знаком («?») в качестве разделителя), и этот новый URI отправляется агенту обработки.
  • post: с помощью HTTP-метода «post» набор данных формы включается в тело формы и отправляется агенту обработки.

Маршруты ASP.NET MVC используются для анализа входящего HTTP-запроса клиента и повторной отправки его соответствующим действиям контроллера. Они также используются помощниками HTML, такими как Html.ActionLink или Html.BeginForm, для создания правильных маршрутов. Просто для вашего конкретного сценария, когда вам нужно передать введенное пользователем значение как часть URL-пути (не строки запроса), HTML-спецификация не может вам ничего предложить.

Итак, если вы хотите бороться со спецификацией HTML, вам придется использовать другие инструменты: javascript. Таким образом, вы можете использовать метод GET и подписаться на обработчик отправки формы и внутри него манипулировать URL, чтобы значение, которое было добавлено после? удовлетворить ваши требования.

Не думайте об этом как о ASP.NET MVC, маршрутах и ​​прочем. Думайте об этом как о простой HTML-странице (что, конечно, видит браузер) и начинайте решать проблему с этой стороны. Как бы вы достигли этого на простой HTML-странице?

...