Как написать собственный MVC ActionFilterAttribute, который перенаправляет приложение Facebook - PullRequest
2 голосов
/ 03 апреля 2009

Мне нужен атрибут, который обрабатывает авторизацию для моих контроллеров. Это для приложения Facebook, и есть несколько препятствий вокруг проблемы.

Что мне действительно нужно, это эквивалент server.transfer, но, конечно, это не вариант в ASP.NET MVC. Перенаправление не будет работать из-за того, как Facebook использует приложение.

Есть ли способ, которым я могу перенаправить из ActionFilterAttribute?

public class FbAuthorize : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!Service.SignedIn())
            RouteToAction("Account", "Index"); // Fictional method (I wish it existed)
    }
}

Ответы [ 3 ]

3 голосов
/ 13 апреля 2009

Если вы используете инструментарий разработчика Facebook, вы можете реализовать метод LoadFBMLPage basepagehelper в методе ActionFiler OnActionExecuting. (в противном случае вам придется самостоятельно выдавать тег fb: redirect). Вот краткое описание: http://onishimura.com/2009/04/13/facebook-and-aspnet-mvc/

1 голос
/ 24 июля 2009

Вот ваш «Server.Transfer ()» или вид:

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);
  }
}

Теперь, в вашем фильтре, просто позвоните:

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

Приветствия

1 голос
/ 03 апреля 2009

Вы можете просто отобразить представление sam с теми же данными, что и действие, которое вы хотите направить. Абстрагируйте код для генерации данных обратно в модель, и оба метода могут использовать его оттуда, чтобы уменьшить дублирование. Это не даст вам тот же URL, но даст вам представление, которое вы хотите.

...