Pull to refresh

ASP.NET MVC — «прячем» Action

Reading time 3 min
Views 3.2K
При активном использовании функции jQuery $.ajax в ASP.NET MVC приложении может возникнуть проблема — юзер может захотеть стукнуться к Action напрямую, вводя адрес в строку браузера. С одной стороны, ничего страшного в этом нет, но желание «спрятать» Action может возникнуть. Предлагаю вот такой легкий способ решения такой проблемы, разумеется, без претензии на оригинальность и мегамонстрячество :)

К примеру, AJAX-запрос вот такого вида

function saveItem(imgurl) {
    $.ajax(
      {
        url: '<%=Url.Action("SaveItem") %>',
        dataType: "json",
        data: {
          categoryid: $("#categoryid").val(),
          itemid: null,
          name: $("#name").val()
        },
        success: function(data) { $("div[id^=edititem]").html('').hide(); getItems($("#categoryid").val()); },
        error: function(e) { alert(e.responseText); }
      }
    )
  }

* This source code was highlighted with Source Code Highlighter.


вызывает метод SaveItem, доступ к которому можно легко получить из строки браузера. Чтобы этого не случилось, я использую вот такой маленький ActionFilterAttribute:

public class AjaxFilterAttribute : ActionFilterAttribute
  {
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      if (!filterContext.HttpContext.Request.IsAjaxRequest())
      {
        filterContext.Result = new RedirectToRouteResult("Error",
                                         new RouteValueDictionary(
                                          new
                                            {
                                              controller = "Home",
                                              action = "Error"
                                            }));
      }

    }
  }

* This source code was highlighted with Source Code Highlighter.


Теперь достаточно любому методу, возвращающему ActionResult, проставить атрибут [AjaxFilter], и юзер, захотевший вызвать его напрямую, будет огорчен. Разумеется, нужно создать View Error.aspx и соответствующий метод в контроллере Home (или там, куда будете переадресовывать)
Tags:
Hubs:
+6
Comments 15
Comments Comments 15

Articles