如何使ActionResult无法通过URL访问,但需要从ajax调用

本文关键字:调用 ajax 访问 URL ActionResult 何使 | 更新日期: 2023-09-27 18:30:03

Grettings好友。所以我已经研究这个网站很长时间了,我还没有得到一个满意的答案。

这是我的控制器:

public ActionResult EliminarLibro(string bookId)
{
    bookModel ModeloLibro = new bookModel();
    ModeloLibro.EliminarLibro(bookId);
    TempData["message"] = "Se ha eliminado el libro correctamente.";
    return RedirectToAction("GestionBiblioteca");
}

这是我的Ajax视图:

var myBookId = $('.parrafo-codigo').text();
    $.ajax({
        type: "GET",
        url: "/Home/VerificarEliminarLibro",
        data: { bookId: myBookId },
        datatype: "json",
        success: function (data) {
            // $('#result').html(data);
            if (data.esteLibroEstaPrestado == true) {
                $('#delModal').modal('hide'); // Quito modal de pregunta si se elimina
                $('#errModal').modal('show'); // Muestra modal de error
            } else {
                window.location.href = '/Home/EliminarLibro/' + myBookId;
            }
        }
    });

问题是:如何使ActionResult EliminarLibro无法通过URL访问(例如XXXX/Home/EliminarLibro/0000532307),但需要从ajax调用?

如何使ActionResult无法通过URL访问,但需要从ajax调用

完成!感谢Amr ElGarhy:

 public class AjaxOnlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.Result = new HttpNotFoundResult();
        }
    }
}

控制器:

 [AjaxOnly]
    public JsonResult VerificarEliminarLibro(string bookId)
    {
        bookModel ModeloLibro = new bookModel();
        bool HayLibrosPrestados = ModeloLibro.VerificarLibroPrestado(bookId);
        if (HayLibrosPrestados == true)
        {
            return Json(new { esteLibroEstaPrestado = true }, JsonRequestBehavior.AllowGet);
        }
        else
        {
            return Json(new { esteLibroEstaPrestado = false }, JsonRequestBehavior.AllowGet);
        }
    }
if (Request.AjaxRequest())
{
    // The Code
}
else
    throw new HttpException(404, "");