Передача данных между контроллерами в. NET Core MVC - PullRequest
0 голосов
/ 07 января 2020

В качестве конкретного примера c в моем приложении я хотел бы, чтобы информация о номере (которая представляет собой комбинацию названия отеля и названия номера) в http://mybooking.com/{hotelName}/{roomNr} была передана на мой контроллер бронирования в http://mybooking.com/reservation, и мне действительно интересно, что было бы лучшим способом сделать это.

Чтобы быть более точным c, на странице Room (на http://mybooking.com/{hotelName}/{roomNr}), когда пользователь нажимает кнопку под названием "Книга" эта комната ", он / она будет перенаправлен на страницу Reservation. Таким образом, я хочу знать наиболее подходящий способ сохранить hotelName и roomNr от Room страницы до Reservation страницы.

Я попытался передать его через URL, например http://mybooking.com/reservation/{hotelName}/{roomNr}, но Я считаю, что это не лучшее решение, так как я могу только тогда получить доступ к hotelName и roomNr в указанном c индексном методе этого контроллера:

//ReservationController
[HttpGet("/Reservation/{hotelName}/{roomNr}")]
public IActionResult Index(string hotelName, int roomNr)
{
    //hotelName and roomNr can only be accessed here
}

Мне нужна эта информация для другие методы внутри контроллера или службы, и мне интересно, применимо ли это к текущей реализации.

Есть предложения по этому делу?

Ответы [ 3 ]

3 голосов
/ 07 января 2020

Ваш сценарий таков: на вашем сайте есть разные отели и комнаты, которые могут просматривать пользователи, и у вас есть процесс «бронирования» или «оформления заказа», состоящий из нескольких страниц, где пользователь может забронировать такую ​​комнату.

Когда пользователь хочет забронировать номер, вы хотите запомнить его отель и идентификаторы номеров на протяжении всего процесса оформления заказа, чтобы вы знали, какой номер в каком отеле он хочет забронировать.

Вы делаете не использовать сеансы или TempData (которые в ASP. NET MVC <= 5 и ASP. NET Core <2.0 раньше сохранялись в сеансе по умолчанию, <a href="https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-3.1#tempdata-providers" rel="nofollow noreferrer"> но теперь в куки ) для этого, потому что сессии и куки совместно используются на вкладках. Таким образом, в этом сценарии пользователь зарезервирует не ту комнату:

  • Пользователь смотрит на комнату 1, нажимает «Забронировать эту комнату». Данные комнаты 1 сохраняются в сеансе. Пользователь проходит проверку до последнего шага, но пока не заканчивает sh.
  • Пользователь открывает новую вкладку, смотрит на комнату 2 для сравнения, нажимает «Забронировать эту комнату», чтобы просмотреть условия, оплата детали, что угодно.
  • Пользователь решает, что ему все равно нужна комната 1, возвращается на вкладку оформления заказа и завершает свой заказ.
  • Поскольку второй щелчок «Забронировать эту комнату» теперь заполнил сеанс деталями комнаты 2, которая является комнатой, которая будет забронирована.

Вы не хотите этого потому что ваш пользователь не хочет этого. Что вы должны сделать, это передать идентификаторы отеля и номера на каждую страницу в процессе оформления заказа.

Независимо от того, делаете ли вы это, используя скрытые поля формы и действия POST, или через строку запроса и действия GET, вам решать.

1 голос
/ 07 января 2020

Не видя, какой у вас код, трудно понять, что вы делаете. Однако, как правило, если вы нажмете на URL http://mybooking.com/{hotelName}/{roomName}

На этом контроллере вы будете знать эти детали и сможете выводить их в представление. С этой точки зрения, если у вас есть кнопка «Зарезервировать эту комнату», кнопка будет в форме. В этой форме у вас будет информация о названии отеля и номера, возможно, в форме идентификаторов, чтобы они были полностью уникальными. Когда пользователь нажимает кнопку, вы отправляете идентификаторы в ReservationController, который затем может использовать эту информацию в своем представлении.

например, что-то вроде

/ {hotelName} / {roomName}

<form action="/reservation" method="post">
<input type="number" name="hotelId" value="{hotelId}" class="hidden" />
<input type="number" name="roomId" value="{roomId}" class="hidden" />
<button type="submit">Reserve Room</button>
</form>

ReservationController должен иметь метод, который принимает HttpPost и имеет аргументы hotelId и roomId

Что-то вроде

[HttpPost]
public IActionResult Index(int hotelId, int roomId){
   // do something with the ids
   // stick them in a ViewBag
   Return View();
}
0 голосов
/ 07 января 2020

Очень простой способ передачи данных между двумя контроллерами - использовать TempData

Предполагая, что вы обрабатываете HTTPPost в http://mybooking.com/{hotelName}/{roomName}, который перенаправляет на http://mybooking.com/reservation, вы можете использовать

TempData["hotelName"] = "a";
TempData["roomName"] = "b";

перед вызовом RedirectToAction.

В методе контроллера http://mybooking.com/reservation вы можете снова получить доступ к TempData.

Вы можете прочитать больше о TempData здесь :

ASP. NET Ядро предоставляет TempData для Razor Pages или TempData для контроллера. Это свойство хранит данные до тех пор, пока они не будут прочитаны в другом запросе. Методы Keep (String) и Peek (string) могут использоваться для проверки данных без удаления в конце запроса. Keep () помечает все элементы в словаре для сохранения. TempData особенно полезна для перенаправления, когда данные требуются для более чем одного запроса. TempData реализуется поставщиками TempData с использованием файлов cookie или состояния сеанса.

...