سطوح دسترسی در فراخوانی PartialView ها
بسم الله الرحمن الرحیم
زمانی که شما یک PartialView میسازید و با استفاده ازhtmlhelper آن را به صورت زیر فراخوانی می کنید.
@Html.Action("myAction", "Home", new { param = "first" })
اگر آدرسPartialView خود را در مرورگر وارد کنید صفحه PartialView برای شما نمایش داده می شود.
این یکی از مشکلاتی که در هنگام استفاده از PartialView ها درMVC رخ می دهد، برای رفع این مشکل اگر بخواهید صرفا از طریق htmlhelpr به آن دسترسی داشته باشید، فقط کافیست بالای متد PartialView مورد نظر Attribute یا خاصیت [ChildActionOnly] را وارد کنید
[ChildActionOnly]
public ActionResult myAction ()
{
return PartialView();
}
اما یک مشکل دیگر هم هنوز وجود دارد و آن اینکه اگر قرار باشد این PartialView را از طریق Ajax فرابخوانید با خطای زیر مواجه می شوید.
The action '' is accessible only by a child request.
بسم الله الرحمن الرحیم
زمانی که شما یک PartialView میسازید و با استفاده ازhtmlhelper آن را به صورت زیر فراخوانی می کنید.
@Html.Action("myAction", "Home", new { param = "first" })
اگر آدرسPartialView خود را در مرورگر وارد کنید صفحه PartialView برای شما نمایش داده می شود.
این یکی از مشکلاتی که در هنگام استفاده از PartialView ها درMVC رخ می دهد، برای رفع این مشکل اگر بخواهید صرفا از طریق htmlhelpr به آن دسترسی داشته باشید، فقط کافیست بالای متد PartialView مورد نظر Attribute یا خاصیت [ChildActionOnly] را وارد کنید
[ChildActionOnly]
public ActionResult myAction ()
{
return PartialView();
}
اما یک مشکل دیگر هم هنوز وجود دارد و آن اینکه اگر قرار باشد این PartialView را از طریق Ajax فرابخوانید با خطای زیر مواجه می شوید.
The action '' is accessible only by a child request.
برای رفع این مشکل نیاز به ایجاد یکAttribute دارید که می توانید کدهای زیر را در یک کلاس جدید ایجاد کرده
public class AjaxOnlyAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if(!filterContext.HttpContext.Request.IsAjaxRequest())
filterContext.HttpContext.Response.Redirect("/error/404");
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}
و سپس در بالای متد خود خاصیت [AjaxOnly] را قرار دهید، در این صورت متد شما فقط از طریق Ajax قابل دسترسی خواهد بود.
[AjaxOnly]
public ActionResult myAction ()
{
return PartialView();
}