Leer ActionParameters no primitivos de filterContext en ActionFilter
Frecuentes
Visto 1,860 veces
1
Actualmente estoy desarrollando un proyecto ASP.NET MVC.
Quiero implementar un ActionFilter, que se encargue de los permisos de propiedad. Un usuario solo puede acceder a las entidades con las que está asociado en la base de datos.
Ahora no quiero implementar esto en cada controlador. En su lugar, quiero usar un ActionFilter. Ya puedo identificar los parámetros entrantes y leer sus valores con el siguiente código:
Regulador
[Validate(ParameterName = "userID", EntityType="User")]
public ActionMethod Edit(int userID){...
Filtro de acción
public string ParameterName { get; set; }
public string EntityType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (EntityType != null && ParameterName != null)
{
Debug.Print("Checking if user has access to the Type \"" + EntityType + "\" with the
ID " + filterContext.ActionParameters[ParameterName]);
...
Hasta ahora, esto funciona bien. Pero cuando se trata de tipos no primitivos (por ejemplo, Usuario), solo encuentro un valor NULL en filterContext.ActionParameters[ParameterName]);
Ver
[HttpPost]
[Validate(ParameterName = "user", EntityType = "User")]
public ActionResult Edit(User user)
{....
No puedo entender por qué. ¿Podría ser porque este es un método HttpPost?
1 Respuestas
2
Esto debería funcionar suponiendo que se haya derivado de ActionFilterAttribute
y no han implementado IAuthorizationFilter
porque si implementa esta interfaz, el filtro de acción se ejecutará antes que el enlazador de modelos y no podrá obtener el resultado de este enlazador de modelos, solo valores de solicitud HTTP simples. Aquí hay un ejemplo:
public class User
{
public string FirstName { get; set; }
}
Atributo de validación:
public class ValidateAttribute : ActionFilterAttribute
{
public string ParameterName { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var result = (User)filterContext.ActionParameters[ParameterName];
if (result.FirstName == "john")
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
Controlador:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new User
{
FirstName = "john"
});
}
[HttpPost]
[Validate(ParameterName = "user")]
public ActionResult Index(User user)
{
return View(user);
}
}
Vista
@model User
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.FirstName)
<button type="submit">OK</button>
}
respondido 10 mar '12, 08:03
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas asp.net-mvc action-filter or haz tu propia pregunta.
¡Esa era exactamente la respuesta que estaba buscando! Tenía IAuthorizationFilter y ActionFilterAttribute implementados en la misma clase. Ahora los dividí, ¡funciona perfecto! Muchas gracias - ckonig