我需要确保我正在开发的应用程序是可访问的,并且还可以关闭JavaScript。我只需要一个指针来协助以下内容。
我有3个'链式'选择框,我希望启用JavaScript的客户端能够获得良好的Ajax体验。我可以轻松编写所需的功能,使用带有WCF服务的jQuery和JSON填充前一个选择的change事件上的链接框。然而,非JavaScript客户端呢?
我是否会在select旁边包含一个提交并将这些提交放在他们自己的表单中以使用特定操作或不同的querstring参数进行回发?同一个控制器可以给我一个部分JSON响应,也可以提供完整的HTML响应。任何人都可以指向一个良好的演示,利用JSON和普通的HTTP帖子在ASP.NET MVC中产生相同的结果。我看到的所有ASP.NET MVC演示/示例都忘记了非JavaScript启用的客户端。
更新
但对于使用Microsoft Ajax客户端库的Ajax调用来说,如果我核心地读取它 - 我想要避免并且只使用jQuery - 那就不是道歉了 - 道歉应该提到它。
此外,我宁愿不在控制器中放置任何噪音(让我想起网络形式的ispostback ......不寒而栗)。
遗憾的是,我没有可以在[AcceptVerbs(HttpVerbs.Post)]等控制器上使用的属性,但对于内容类型,例如[AcceptType(httpTypes.Json)]。
必须有比使用if if语句更好的方法.....
答案 0 :(得分:3)
您可以检查IsMvcAjaxRequest属性并在控制器中使用它,然后返回部分视图(用户控件)或JSON结果(如果为true),或者返回完整视图(如果为false)。
这样的事情:
public ActionResult List()
{
if (!Request.IsMvcAjaxRequest())
{
// Non AJAX requests see the entire ViewPage.
return View();
}
else
{
// AJAX requests just get a trimmed down UserControl.
return Json(...);
}
}
答案 1 :(得分:2)
本文为您的问题提供了一个优雅的解决方案:http://devlicio.us/blogs/sergio_pereira/archive/2008/12/05/reusing-views-in-asp-net-mvc-for-ajax-updates.aspx
答案 2 :(得分:1)
(参见你之前的回答):您可以在Request.Form中传递一个值,表示这是一个启用或未启用javascript的浏览器,然后创建一个控制器工厂,根据您的实例来实例化适当的控制器进入Request.Form;常规请求的默认控制器(启用了javascript的浏览器)和仅返回完整视图的“后备控制器”。我不确定控制器数量的两倍是否比单个控制器周围的if-else语句更好,但我想这是个人偏好的问题。
我下注虽然有更简单的解决方案。我希望这个问题有更多的曝光。