Передача параметров в контроллер ... но НЕ по URL - PullRequest
5 голосов
/ 28 декабря 2011

Есть ли способ передать параметр в контроллер, не помещая его в URL?

Например, http://www.winepassionate.com/p/19/wine-chianti-docg-la-moto

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

Так что я бы не хотел передавать идентификатор в URL, но все же смог бы передать его контроллеру. Какой рекомендуемый способ сделать это?

Ответы [ 4 ]

3 голосов
/ 28 декабря 2011

Ну, у вас есть несколько вариантов:

  1. Это сообщение формы? Если это так, то вы можете просто добавить определенную пару ключ-значение в форму при ее отправке, и тогда данные будут переданы.
  2. Является ли URL-адрес уникальным для этого ресурса? т.е. существует ли Wine-chianti-docg-la-moto как уникальное представление числа 19 в базе данных где-то? Если это так, то вы можете просто выполнить поиск этого компонента маршрута в своей базе данных, чтобы получить нужное вам значение (или передать эту логику до самой базы данных).
  3. Это значение, которое не должно меняться? Вы можете установить это значение в сеансе или в файле cookie, который будет сохраняться на всех страницах, а затем извлекать его из соответствующей коллекции.
  4. Вы перенаправляете на эту страницу с другого запроса на вашем сервере? Если это так, то вы можете использовать TempData для хранения этого временного значения. Тем не менее, я бы рекомендовал против такого подхода, так как он очень временный и не очень хорошая практика, иммо.
  5. Наконец, вы можете скрыть значение в URL, если не хотите, чтобы оно было легко редактируемым пользователем. Зашифруйте его с помощью некоторого алгоритма, а затем расшифруйте на странице назначения. Пользователь вряд ли сможет изменить идентификатор, введя другое значение в URL.
3 голосов
/ 28 декабря 2011

Вы можете сделать сообщение и отправить его в качестве параметра формы. Я не рекомендую это. Сообщения должны быть для запросов, которые изменяют данные. В этом случае вы, скорее всего, просто хотите получить эти данные. Хорошо, что идентификатор указан в URL-адресе (см. Ссылки на переполнение стека). Если вы действительно не хотите, чтобы пользователь мог изменять его (я надеюсь, что это не потому, что вы думаете, что это делает его более безопасным, а потому что это не так), вы можете сделать на нем простое шифрование, чтобы сделать его более трудным угадать / создать действительный идентификатор.

Использование TempData, как предлагают некоторые другие, не является надежным решением. Он не будет работать для ссылок на странице, только GET после POST и только один раз, поскольку TempData удаляется после следующего запроса.

2 голосов
/ 28 декабря 2011

Если страница является GET, и вы следуете PRG, как вы должны (Post-Redirect-Get), тогда вы можете использовать TempData ["dataName"] = value; в вашем контроллере [HttpPost] и затем используйте его в вашем методе [HttpGet]. Это действительно зависит от того, как страница вызывается.

Тем не менее, нет ничего плохого в том, чтобы позволить пользователю изменить это число, если оно не связано с безопасностью, и это обычная практика - показывать в URL такую ​​не жизненно важную информацию.

0 голосов
/ 28 декабря 2011

В этом случае вы должны использовать TempData.Хорошее прочтение можно найти в этом блоге .

TempData позволяет временно хранить значение между запросами и по умолчанию стирается после обращения.

// TempData samplepublic ActionResult Featured(){    var featuredProduct = new Product    {        Name = "Assorted Cupcakes",        Description = "Delectable vanilla and chocolate cupcakes",        CreationDate = DateTime.Today,        ExpirationDate = DateTime.Today.AddDays(7),        ImageName = "cupcakes.jpg",        Price = 5.99M,        QtyOnHand = 12    };
...