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

时间:2013-04-29 16:48:18

标签: ajax asp.net-mvc api

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

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

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

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

由于

2 个答案:

答案 0 :(得分:6)

  

如果我复制此网址" 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);
    }
}

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

答案 1 :(得分:0)

为AJAX和Views使用单独的控制器或操作方法。 View控制器应与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源控制器获取数据。