在asp.mvc中使用历史api处理直接URL

use*_*014 2 api ajax asp.net-mvc

我的网站像 http://mysite.com/,在索引页面上我有搜索框,结果我使用的是jqgrid.当用户点击jqgrid行中的行时,我从单元格中获取数据并对服务器执行ajax调用并获取json数据,一旦数据到达,我将隐藏搜索框和jqgrid并显示另一个div,这是我保留的结果.简而言之,用户将在同一页面上只是div的隐藏/显示.

现在我已经看过历史api并使用了pushState和popstate,所以我的url变成了地址栏,如http://mysite.com/controller/action/para1/para2(这里para1和para2是我传递给行动的参数).到目前为止一切都还可以.

现在的问题是,如果我复制这个URL" http://mysite.com/controller/action/para1/para2 ",如果我打开它,让我们说不同的浏览器并点击输入它只显示json数据.所以,我很困惑,当用户直接在控制器中使用该url时如何处理.

我正在考虑检查控制器动作,如果请求是AJAX然后返回json数据,否则整页,是正确的方法?或者我们在客户端的东西,以便它加载与以前相同的方式.

谢谢

Est*_*ban 6

如果我复制这个URL" http://mysite.com/controller/action/para1/para2 ",如果我打开它,让我们说不同的浏览器并点击输入它只显示json数据.

它只显示json数据,因为它的ajax调用只是如此处理,以便它也显示相同的页面甚至用户直接访问url.

我想你要找的是Request.IsAjaxRequest():

public class FooController : Controller {
    public ActionResult GetFoo(int id) {
        var model = _fooService.Get(id);

        if (Request.IsAjaxRequest())
            return PartialView("_Foo", model);

        return View("Foo", model);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:建议使用WebAPI控制器仅处理json数据.因此,如果用户通过键入url到达那里,mvc控制器将处理它,如果你需要获取该视图的json数据,你可以调用webapi控制器.