ASP.NET MVC: UrlReferrer или куда послать пользователя

Задача на статью

Предыстория описана в описании статьи, а значит сразу к делу. Чтобы вернуть пользователя “обратно”. Надо знать откуда он пришел. Самый просто способ это сделать – использовать

HttpContext.Request.UrlReferrer

А чтобы не писать его создадим кое-какой класс или несколько. Итак первым делом, создадим атрибут (класс) ReferrerHoldAttribute, который унаследуем от ActionFilterAttribute:

public class ReferrerHoldAttribute : ActionFilterAttribute {
	public override void OnActionExecuting(ActionExecutingContext filterContext) {
		var referrer = filterContext.RequestContext.HttpContext.Request.UrlReferrer;
		if (referrer != null) {
			filterContext.RouteData.Values.Add("referrer", referrer);
		}
		base.OnActionExecuting(filterContext);
	}
}

Думаю, пояснений не требуется. Далее просто будем его использовать. Для того чтобы “понять” откуда пришел пользователь, надо поставить атрибут над методом контролера. А затем просто его использовать:

[ReferrerHold]
public ActionResult Edit(int id) {
	var product = _smart.Products.GetById(id);
	if (product != null) {
		TempData["referrer"] = ControllerContext.RouteData.Values["referrer"];
		FillGeneralDictionaries();
		var model = product.MapTo<Product, ProductShowViewModel>();
		return View(model);
	}
	return RedirectToAction("http404", "error");
}

В первой строке поставили, далее в TempData[“referrer”] запихнули значение полученное из маршрута. А потом из POST-метода вызвали Redirect, чтобы перекинуть пользователя обратно:

[HttpPost]
public ActionResult Edit(ProductViewModel model) {
	if (ModelState.IsValid) {
		var product = _smart.Products.GetById(model.Id);
		Mapper.Map(model, product);
		product.UpdatedAt = DateTime.Now;
		product.UpdatedBy = User.Identity.Name;
		_smart.Products.Update(product);
		_smart.Logs.Log("Новый товар \"{0}\" успешно изменен", model.Name);
		_smart.Commit();
		if (TempData["referrer"] != null) {
			return Redirect(TempData["referrer"].ToString()); //"all", "catalog");		}
		return RedirectToRoute("Catalog");//"all", "catalog");	}
	FillGeneralDictionaries();
	return View(model);
}

Здесь тоже обойдемся без пояснений.

Развитие темы

Что можно предложить в продолжение темы. Дальше можно сделать свой собственный ActionResult, обозвав его, например, ReferrerResult, и унаследовав от базового класса реализовать обработку:

ControllerContext.RouteData.Values["referrer"];

Или также можно сделать базовый контролер, который всегда будет “знать кто, куда и откуда пришел”.

Заключение

Большое количество поступающих вопросов относительно озвученной тему породило данную статью, которая получилась короткой в силу своей тривиальности.

Подробнее: http://feedproxy.google.com/~r/blogmusor/~3/YpSJnbS3eoY/114

Читать комменты и комментировать

Добавить комментарий / отзыв



Защитный код
Обновить

ASP.NET MVC: UrlReferrer или куда послать пользователя | | 2013-04-29 13:27:44 | | Программирование | | Задача на статьюПредыстория описана в описании статьи, а значит сразу к делу. Чтобы вернуть пользователя “обратно”. Надо знать откуда он пришел. Самый просто способ это сделать – использовать | РэдЛайн, создание сайта, заказать сайт, разработка сайтов, реклама в Интернете, продвижение, маркетинговые исследования, дизайн студия, веб дизайн, раскрутка сайта, создать сайт компании, сделать сайт, создание сайтов, изготовление сайта, обслуживание сайтов, изготовление сайтов, заказать интернет сайт, создать сайт, изготовить сайт, разработка сайта, web студия, создание веб сайта, поддержка сайта, сайт на заказ, сопровождение сайта, дизайн сайта, сайт под ключ, заказ сайта, реклама сайта, хостинг, регистрация доменов, хабаровск, краснодар, москва, комсомольск |
 
Поделиться с друзьями: