ASP.NET MVC 3重定向到根页面的请求

时间:2014-06-02 21:01:53

标签: javascript jquery asp.net ajax asp.net-mvc

我目前在一个1页的网站上工作,我遇到了以下问题。

本网站有5个部分,我们希望为页面中的每个部分创建链接,而不使用#/ hash链接。我们通过使用PJAX插件来解决这个问题。因此,例如,如果用户点击关于链接,它将使用PJAX插件来更改URL并添加到推送状态......这很有效。但是,当我们直接访问URL时,例如/关于我们希望能够"赶上"此请求并将页面请求路由回主页(并使用jquery滚动到About div)。由于实际/关于页面没有内容,只是用作PJAX调用的虚拟页面。

感谢。

1 个答案:

答案 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")]