我的网站有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数据,否则是完整页面,这是正确的方法吗?或者客户端的东西我们有,所以它加载方式与之前相同。
由于
答案 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源控制器获取数据。