我希望我的asp.net mvc内核中的局部视图只能通过AJAX请求获得。我无法确定阻止从URL直接访问局部视图的逻辑。
我使用的一种方法是
[HttpPost]
public IActionResult Search(ListNSearchModel modelMain)
{ //....some logic...
return PartialView();
}
这使我的代码只能通过“发帖请求”获得,但我认为这不是正确的方法。
答案 0 :(得分:1)
您可以为控制器操作创建一个注释,以防止用户直接访问它。请注意,无论请求是否来自Ajax,以下内容均应正常工作(可以只是通过HTML助手调用一个操作以返回部分视图):
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class NoDirectAccessAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.UrlReferrer == null ||
filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host)
{
filterContext.Result = new RedirectToRouteResult(new
RouteValueDictionary(new { controller = "Home", action = "Index", area = "" }));
}
}
}
然后用它来注释您的控制器操作:
[HttpPost]
[NoDirectAccess]
public IActionResult Search(ListNSearchModel modelMain)
{
return PartialView();
}
答案 1 :(得分:1)
X-Requested-With
标头返回一个字符串,该字符串指示它是否是Ajax请求。 Ajax请求会将此标头设置为XMLHttpRequest
。对于正常的GET和POST请求(非Ajax请求),此标头值将不存在。
所以您可以只写如下属性:
public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor actionDescriptor)
{
if (routeContext.HttpContext.Request.Headers != null &&
routeContext.HttpContext.Request.Headers.ContainsKey("X-Requested-With") &&
routeContext.HttpContext.Request.Headers.TryGetValue("X-Requested-With", out StringValues requestedWithHeader))
{
if (requestedWithHeader.Contains("XMLHttpRequest"))
{
return true;
}
}
return false;
}
}
然后像这样使用:
[AjaxOnlyAttribute]
public IActionResult Search()
{
return PartialView();
}
或者您可以直接在特定操作中进行检查:
string method = HttpContext.Request.Method;
string requestedWith =
HttpContext.Request.Headers["X-Requested-With"];
if (method == "POST")
{
if (requestedWith == "XMLHttpRequest")
{
// code goes here
}
}
答案 2 :(得分:1)
只需在您的操作上方添加 [ChildActionOnly] 即可防止用户直接访问。
**[ChildActionOnly]**
[HttpPost]
public IActionResult Search(ListNSearchModel modelMain)
{ //....some logic...
return PartialView();
}