При активном использовании функции jQuery $.ajax в ASP.NET MVC приложении может возникнуть проблема — юзер может захотеть стукнуться к Action напрямую, вводя адрес в строку браузера. С одной стороны, ничего страшного в этом нет, но желание «спрятать» Action может возникнуть. Предлагаю вот такой легкий способ решения такой проблемы, разумеется, без претензии на оригинальность и мегамонстрячество :)
К примеру, AJAX-запрос вот такого вида
вызывает метод SaveItem, доступ к которому можно легко получить из строки браузера. Чтобы этого не случилось, я использую вот такой маленький ActionFilterAttribute:
Теперь достаточно любому методу, возвращающему ActionResult, проставить атрибут [AjaxFilter], и юзер, захотевший вызвать его напрямую, будет огорчен. Разумеется, нужно создать View Error.aspx и соответствующий метод в контроллере Home (или там, куда будете переадресовывать)
К примеру, 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 (или там, куда будете переадресовывать)