Cómo escribir un MVC ActionFilterAttribute personalizado que redirige una aplicación de Facebook

votos
2

Necesito un atributo que maneje la autorización para mis controladores. Esto es para una aplicación de Facebook y hay algunos obstáculos que rodean el problema.

Lo que realmente necesito es el equivalente a un server.transferpero, por supuesto, esa no es una opción en ASP.NET MVC. Una redirección no funcionará debido a la forma en que Facebook consume la aplicación.

¿Hay alguna manera de redirigir desde dentro ActionFilterAttribute?

public class FbAuthorize : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!Service.SignedIn())
            RouteToAction(Account, Index); // Fictional method (I wish it existed)
    }
}
Publicado el 03/04/2009 a las 14:22
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
1

Podría simplemente renderizar la vista sam con los mismos datos a los que la acción que desea enrutar habría representado. Resuma el código para volver a generar los datos en el modelo y ambos métodos podrían usarlo desde allí para reducir la duplicación. Esto no le dará la misma URL, pero le dará la vista que desee.

Respondida el 03/04/2009 a las 14:30
fuente por usuario

votos
3

Si está utilizando el kit de herramientas del desarrollador de Facebook, puede implementar el método LoadFBMLPage de basepagehelper en el método OnActionExecuting de ActionFiler. (de lo contrario, deberá emitir la etiqueta fb: redirect usted mismo). Aquí hay una breve reseña: http://onishimura.com/2009/04/13/facebook-and-aspnet-mvc/

Respondida el 13/04/2009 a las 08:06
fuente por usuario

votos
1

Aquí está su "Servidor.Transfer ()" o tipo de:

public static class ServerHelper {

  public static void Transfer(ActionExecutingContext filterContext, string url) {

    // Rewrite path
    HttpContext.Current.RewritePath(GetPath(filterContext, url), false);

    IHttpHandler httpHandler = new System.Web.Mvc.MvcHttpHandler();

    // Process request
    httpHandler.ProcessRequest(HttpContext.Current);
    filterContext.HttpContext.Response.End();
  }

  private static string GetPath(ActionExecutingContext filterContext, string url) {
      HttpRequestBase request = filterContext.HttpContext.Request;

      UriBuilder uriBuilder = new UriBuilder(request.Url.Scheme, request.Url.Host, request.Url.Port, request.ApplicationPath);

      uriBuilder.Path += url;

      return filterContext.HttpContext.Server.UrlDecode(uriBuilder.Uri.PathAndQuery);
  }
}

Ahora, en su filtro, solo llame:

ServerHelper.Transfer(filterContext, "Account/Index");

Aclamaciones

Respondida el 24/07/2009 a las 15:56
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more