我目前在一个1页的网站上工作,我遇到了以下问题。
本网站有5个部分,我们希望为页面中的每个部分创建链接,而不使用#/ hash链接。我们通过使用PJAX插件来解决这个问题。因此,例如,如果用户点击关于链接,它将使用PJAX插件来更改URL并添加到推送状态......这很有效。但是,当我们直接访问URL时,例如/关于我们希望能够"赶上"此请求并将页面请求路由回主页(并使用jquery滚动到About div)。由于实际/关于页面没有内容,只是用作PJAX调用的虚拟页面。
感谢。
答案 0 :(得分:1)
发送PJAX请求时,始终应该在HTTP请求中包含此标头:
X-PJAX:是的
您可以通过添加自定义ActionMethodSelectorAttribute
来重定向不同的请求,以检查X-PJAX
标头是否存在。
将此自定义Attribute
类添加到您的解决方案中:
public class AcceptHeaderAttribute : ActionMethodSelectorAttribute
{
public string HeaderName { get; set; }
public string HeaderValue { get; set; }
public AcceptHeaderAttribute(string headerName, string headerValue = null)
{
if (String.IsNullOrWhiteSpace(headerName))
throw new ArgumentNullException("headerName");
HeaderName = headerName;
HeaderValue = headerValue;
}
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
if (controllerContext == null)
throw new ArgumentNullException("controllerContext");
var incomingHeader = controllerContext.HttpContext.Request.Headers[HeaderName];
var headerExists = String.IsNullOrWhiteSpace(incomingHeader);
// NOTE: can optionally change this to Contains, or add a parameter for that.
var valueCorrect = String.Equals(incomingHeader, HeaderValue, StringComparison.OrdinalIgnoreCase);
return (String.IsNullOrWhiteSpace(HeaderValue)
? headerExists
: valueCorrect);
}
}
然后,您可以为PJAX请求与直接用户请求设置不同的Action
:
[AcceptHeader("X-PJAX", "true")]
public ActionResult About(string myInput)
{
ViewBag.Test = "This is a PJAX request";
return View();
}
public ActionResult About()
{
ViewBag.Test = "This is a normal request";
return View();
// or redirect them to root page
return RedirectToAction("Index");
}
如果您只想检查HTTP请求中是否存在标题,并且不关心该值是否正确,则可以将使用简化为:
[AcceptHeader("X-PJAX")]