Пост-редирект Получить скрытые параметры URL

Позвольте мне сначала изложить здесь сценарий. Это делается с помощью ASP.NET 4.0, MVC3 и C #.

У меня есть картинная галерея. У меня есть менеджер альбомов в картинной галерее. В каждой галерее есть набор страниц.

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

В списке альбомов можно выбрать для редактирования, удаления или управления страницами в этом альбоме.

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

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

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

Таким образом, представление для страниц создается контроллером [HttpPost]. Затем из представления для управления страницами при нажатии кнопки редактирования страница для редактирования создается контроллером [HttpPost] по той же причине (чтобы скрыть параметры).

Вот проблема: после нажатия кнопки сохранения в режиме редактирования данные отправляются в контроллер сохранения изменений через [HttpPost], но я не хочу возвращать вид редактирования (обновление приведет к повторной публикации изменений, и это не совсем лучший вариант). упражняться). Я хочу вернуться к списку страниц выбранного альбома. При этом я использую [HttpPost] из контроллера редактирования для перенаправления обратно на контроллер [HttpGet] для представления, в котором перечислены страницы для выбранного альбома. Когда я это сделаю, вызов будет выглядеть так:

return RedirectToAction("ManagePages", new { albumId = model.AlbumId });

К сожалению, это приводит к тому, что в URL-адресе отображается идентификатор альбома: http://XXX/ManagePages?AlbumId=56.

Как я могу вернуться в представление ManagePages для того же выбранного альбома, не показывая идентификатор альбома в списке параметров?


person Travis J    schedule 11.12.2011    source источник


Ответы (3)


Вы можете сохранить идентификатор альбома в TempData непосредственно перед выполнением перенаправления, используя:

TempData["AlbumId"] = model.AlbumId;
return RedirectToAction("ManagePages");

Затем в действии ManagePages GET вы можете прочитать содержимое идентификатора:

int albumId = (int)TempData["AlbumId"];

Примечание. После считывания идентификатора содержимое TempData ["AlbumId"] будет очищено.


Обновлять:

На самом деле, если вы используете TempData и пользователь нажимает кнопку «Обновить», то при обновлении данные будут потеряны. Следовательно, вместо этого вы можете использовать сеанс:

Session["AlbumId"] = model.AlbumId;
...
int albumId = (int)Session["AlbumId"];
person Dangerous    schedule 11.12.2011
comment
Кроме того, если пользователь обновляет страницу, которая только что получила эти TempData, произойдет ли сбой страницы, поскольку ожидается, что данные не были отправлены после рендеринга? - person Travis J; 12.12.2011
comment
Я обновил свой ответ, чтобы также использовать сеанс. На самом деле TempData, вероятно, лучше всего подходит для передачи таких вещей, как сообщения об ошибках, где не имеет значения, теряются ли они при обновлении. Однако я бы сам подумал о том, чтобы передать идентификатор в URL-адрес как часть RedirectToAction (). Не так уж плохо предоставлять идентификатор пользователю, если вы знаете (и выполняете любую необходимую проверку на стороне сервера), поскольку хакер потенциально может изменить его на другой идентификатор (действительный или недействительный). - person Dangerous; 12.12.2011
comment
а) Все ли может сделать злоумышленник с помощью смены идентификатора? б) На httpget я могу просто переназначить временные данные и держать их до тех пор, пока их не нужно будет снова прочитать, или это считается плохой практикой - person Travis J; 12.12.2011
comment
а) Злоумышленник потенциально может изменить любое значение, переданное в URL-адресе или скрытое в форме. Если вы выставляете идентификатор, такой как идентификатор альбома, все будет в порядке. Многие веб-сайты интернет-магазинов используют идентификаторы продуктов или категорий в URL-адресах. Если вы измените и отправите их, вы получите неправильный продукт или категорию (пользователь виноват в изменении) или страницу с ошибкой, в любом случае никакого вреда. Пока вы не раскрываете конфиденциальную информацию о клиенте, все будет в порядке. См. «Задача 3 - Добавление параметра Id, встроенного в URL-адрес» следующей ссылки: msdn.microsoft. ru / en-us / gg592076 - person Dangerous; 12.12.2011
comment
б) Хотя можно переназначить TempData или использовать .Peek (), чтобы не удалять содержимое, если вы собираетесь это сделать, я бы подумал, что лучше использовать сеанс. - person Dangerous; 12.12.2011
comment
Спасибо за ваши предложения и ответы, мы очень ценим их. Просто чтобы быть внимательным и убедиться, что это правильно: можно ли выставлять идентификаторы в URL-адресе? Показывать идентификаторы в URL - это неплохая практика? (Пока обрабатываются плохие идентификаторы и неавторизованные идентификаторы) - person Travis J; 13.12.2011
comment
stackoverflow .com / questions / 910683 / stackoverflow.com/questions/3629134/ Маршрут по умолчанию, поставляемый с MVC3: new {controller = Home, action = Index, id =}. Вы должны предоставить URL-адрес с id до тех пор, пока вы не раскрываете конфиденциальную информацию и пока вы остерегаетесь возможности того, что идентификатор может иметь другое значение, чем вы ожидаете. Но пользователи виноваты в изменении, если вы вернете страницу с ошибкой. - person Dangerous; 13.12.2011

Перед выполнением RedirectToAction вы можете установить cookie с идентификатором альбома. Затем вы читаете это в действии ManagePages.

Однако стоит отметить, что если вы не уверены в том, что внутренние идентификаторы известны извне, ваше приложение по-прежнему предоставляет их через источник HTML. Другие пользователи могут использовать их для просмотра данных, которые они не предполагают, если у вас нет какого-либо механизма аутентификации.

person jmacinnes    schedule 11.12.2011

Вы можете скрыть идентификатор в переменной TempData. TempData сохраняется через одно перенаправление.

person hawkke    schedule 11.12.2011