2

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

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

现在的问题是,如果我复制这个 URL “ http://mysite.com/controller/action/para1/para2 ”,如果我用不同的浏览器打开它,然后按回车键,它只显示 json 数据。所以,我很困惑当用户直接在控制器中使用该 url 时如何处理。

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

谢谢

4

2 回答 2

6

如果我复制此 URL“ http://mysite.com/controller/action/para1/para2 ”并且如果我用不同的浏览器打开它并按 Enter 键,它只显示 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);
    }
}

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

于 2013-05-15T03:42:46.937 回答
0

为 AJAX 和视图使用单独的控制器或操作方法。视图控制器应与 URL 匹配。Ajax 控制器应该是不太“漂亮”的 URL,因为它在幕后。

如果您尚未这样做,则需要在 global.asax (MVC 3) 或 App_Start/RouteConfig.cs (MVC 4) 中设置路由定义来处理参数。

routes.MapRoute(
            "MyRoute",
            "MyUrlController/{action}/{para1}/{para2}",
            new
                {
                    action = "Index",
                    para1 = UrlParameter.Optional,
                    para2 = UrlParameter.Optional
                }
                );

然后在视图控制器中:

public ActionResult Index(string para1 = "Default Value", string para2 = "Default Value")
    {
        // ...Handle parameters...

        return View("_MyView", viewModel);
    }

返回一个 View 对象类型是关键。History API URL 没有从返回 PartialViewResult 的同一个 AJAX 源控制器获取数据。

于 2013-05-15T03:39:35.277 回答