Solo permitir el acceso a la acción si se redirige a una acción específica

¿Existe una buena manera de restringir el acceso a una acción, de modo que solo puede acceder a ella si fue redirigido desde otra acción? Por ejemplo:

[HttpPost] public virtual ActionResult Create(MyViewModel vm) { if (ModelState.IsValid) { // do some work return RedirectToAction("CreateSuccess"); } else { return View(vm); } } public virtual ActionResult CreateSuccess() { // only allow execution if you were redirected from Action "Create" } 

Una forma fácil sería almacenar una bandera en TempData en el primer método y verificar que la bandera existe en el método al que se redirige.
TempData está ahí para pasar información de estado entre solicitudes de acción y solo durará la duración de la solicitud, por lo que no tendrá que preocuparse por borrarla.

No hay forma de saber la acción “desde” a menos que incluya parámetros que lo indiquen. La forma más fácil es agregar un parámetro “SourceAction” o “FromAction” y verificarlo en la acción “destino”.

La pregunta es, ¿por qué quieres hacer eso? Tal vez hay una mejor solución para su problema principal.

De todos modos, puede usar la propiedad HttpContext.Current.Request.UrlReferrer para verificar la página anterior Url.

Primera solucion

Usted podría hacer esto:

 [HttpPost] public virtual ActionResult Create(MyViewModel vm) { if (ModelState.IsValid) { // do some work return this.CreateSuccess(); } else { return View(vm); } } [NonAction] public virtual ActionResult CreateSuccess() { // do what's needed } 

Este último método solo será ejecutado desde otros métodos de acción. Pero no se puede ejecutar per se.

Segunda solucion

También puede resolverlo creando un atributo de selector de método de acción personalizado si sabe que puede reutilizarlo. Podría escribir un atributo selector de método de acción personalizado que verifique la referencia de solicitud y use el método apropiado.

Lea acerca de los atributos de selector de acción personalizados .