2015-03-16 2 views
6

У меня есть ASP.NET MVC интернет-магазин, как приложение с двумя видами:Pass сообщение о перенаправлении для просмотра в ASP.NET MVC

  • страница предмета (фото, описание и т.д.)
  • Форма, в которой пользователь может оставить отзыв

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

Код контроллера (упрощенный) выглядит следующим образом:

[HttpGet] 
public ActionResult ViewItem([Bind] long id) 
{ 
    var item = _context.Items.First(x => x.Id == id); 
    return View(item); 
} 

[HttpGet] 
public ActionResult AddReview() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult AddReview([Bind] long id, [Bind] string text) 
{ 
    _context.Reviews.Add(new Review { Id = id, Text = text }); 
    _context.SaveChanges(); 

    return RedirectToAction("ViewItem"); 
} 

Есть несколько требований, чтобы удовлетворить:

  • Сообщение не должно показать еще раз, если пользователь обновляет страницу элемента.
  • Сообщение не должно загрязнять URL.
  • Методы контроллера не могут быть объединены в один.

Я думал о сохранении сообщения в сеансе пользователя и отбрасывании его после его отображения, но может быть, есть лучшее решение?

+1

TempData будет работать для этого. См. Пример в этом вопросе: [http://stackoverflow.com/questions/1500402/when-to-use-tempdata-vs-session-in-asp-net-mvc](http://stackoverflow.com/questions/1500402/when-to-use-tempdata-vs-session-in-asp-net-mvc) – markpsmith

+2

ViewBag или ViewData будут лучше сеанса. См. Http://www.arunprakash.co.in/2013/08/viewbag-viewdata-tempdata-and-view.html –

+0

TEMPDATA рекомендуется здесь, он будет действовать как флэш-мессенджер. –

ответ

11

С помощью tempdata вы можете передавать сообщение или данные (строку/объект) с одной страницы на другую и действовать только с одного действия на другое.

Некоторые ключевые моменты TempData:

  1. TempData является собственностью класса ControllerBase.
  2. TempData используется для передачи данных из текущего запроса на последующий запрос (означает перенаправление с одной страницы на другую).
  3. Жизнь очень короткая и лежит только до тех пор, пока целевой вид не будет полностью загружен.
  4. Требуется приведение типов для получения данных и проверка нулевых значений во избежание ошибок.
  5. Используется для хранения только однократных сообщений, таких как сообщения об ошибках, сообщения проверки. Чтобы сохранить данные с TempData см эту статью: Persisting Data with TempData

В контроллере:

[HttpPost] 
    public ActionResult AddReview([Bind] long id, [Bind] string text) 
    { 
     _context.Reviews.Add(new Review { Id = id, Text = text }); 
     _context.SaveChanges(); 

     TempData["message"] = "someMessage"; 
     return RedirectToAction("ViewItem"); 
    } 

В вашей странице просмотра:

 @TempData["message"]; //TempData["message"].ToString(); 
+4

Вам не хватает смысла. В вашем ответе указывается _ «Использовать этот код» _, не объясняя, что он делает (и что означает код с комментариями?). Хороший ответ не только помогает ОП из-за его текущей проблемы, но и объясняет, почему это происходит, поэтому позже посетители могут оценить, подходит ли это для них. – CodeCaster

Смежные вопросы