Установка значения раскрывающегося списка на основе ранее выбранного значения - PullRequest
0 голосов
/ 02 июля 2018

В настоящее время у меня есть страница входа в API, где пользователь может выбрать местоположение из выпадающего меню. После входа в систему появляется целевая страница. Затем пользователь может перейти на страницу «Тестовый клиент», где он должен снова пройти аутентификацию с тем же раскрывающимся списком «Расположение». В настоящее время я заполняю список мест ViewBag, устанавливая для него значение

new SelectList(locations, "LocationID", "Name", model.LocationID)

Где местоположения - это список моих местоположений. На странице Test Client я заполняю свой список из этого ранее построенного списка, хранящегося в ViewBag.Locations. Как перенести выбранное пользователем значение из этого списка на исходной странице входа на страницу Test Client? У меня проблемы с тем, как подойти к этому.

Я пытался использовать

Request.Form["LocationID"]

но запрос POST из первой формы не может быть доступен с этой первой страницы входа на странице тестового клиента.

Ответы [ 5 ]

0 голосов
/ 02 июля 2018

Как предлагается в приведенных выше ответах от jle и Haytam, вы можете использовать Session или TempData. Я бы не рекомендовал параметры строки запроса URL-адреса, потому что вам нужно будет позаботиться о том, чтобы эти параметры передавались на каждую последующую страницу, до того как пользователь достигнет страницы TestClient.

Однако вы также упомянули страницу входа API. Если вы используете веб-API, вам будет сложно получить доступ к памяти уровня сеанса.

Я бы порекомендовал третий подход, то есть создание поля LastUsedLocationId в модели IdentityUser. Таким образом, вы можете легко запросить базу данных для текущего пользователя и получить LastUsedLocationId и использовать его в вашем ViewBag, например:

new SelectList(locations, "LocationID", "Name", user.LastUsedLocationId)

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

0 голосов
/ 02 июля 2018

Viewbag используется в области генерации страницы single . Он не сохраняет данные между разными страницами.

Что означает, что ваш вопрос сводится к:

Как сохранить данные между разными страницами?

Здесь есть несколько решений:

  1. Использовать cookie .

Файлы cookie существуют специально для того, чтобы браузер пользователя сохранял информацию, которую впоследствии можно будет найти на вашей веб-странице. Это работает, только если обе страницы находятся в одном домене, поскольку доступ к файлам cookie ограничен доменом текущей страницы (например, файл cookie Twitter не может получить доступ к файлу cookie facebook).

  1. Использовать Сеанс Данные.

Данные сеанса существуют специально для того, чтобы иметь временное хранилище данных для пользователя. Рассматривайте данные сеанса как (своего рода) файл cookie на веб-сервере, который длится только столько времени, сколько сеанс (который обычно заканчивается после примерно 20 минут бездействия или когда пользователь закрывает свой браузер).

(TempData похожа на данные сеанса)

  1. Явно передать параметр на вторую страницу.

Вместо того, чтобы кэшировать значение, просто сделайте его параметром URL второй страницы. Например: http://www.example.com/SecondPage?selectedLocationId=123.

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


Доступно больше решений, но это стандартные решения, которые не требуют большой дополнительной работы.

0 голосов
/ 02 июля 2018

Кажется странным, что пользователь должен дважды войти в систему с одной и той же информацией, но чтобы ответить вам, вы можете использовать TempData для передачи данных между контроллерами (при условии, что вы используете перенаправление).
TempData доступен только для сеанса пользователя, поэтому он сохраняется только до тех пор, пока вы его не прочитаете, и не будет очищен в конце HTTP-запроса.
Пример:

// In your login action, when it's done
TempData["Location"] = X;
return RedirectToAction(...);

// Then in your other action or it's view, just use
TempData["Location"] // and use it

Если вы не используете перенаправление, вы, вероятно, захотите сохранить значение, например, в сеансе, базе данных или чем-то подобном.

0 голосов
/ 02 июля 2018

Один из вариантов - использовать Session State:

Session["LocationID"]=model.LocationID;

и затем вы можете получить доступ с другой страницы. Как указано в другом ответе, TempData делает то же самое, но по-другому. Наконец, вы можете передать значение в URL.

0 голосов
/ 02 июля 2018

Вы можете отправить его вместе со страницей назначения (например, в URL), а затем передать на страницу Test Client.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...