渐进式增强 - JavaScript关闭时该怎么办?

时间:2011-04-02 01:00:27

标签: asp.net-mvc ajax progressive-enhancement

我理解渐进增强是什么,我只是模糊了一些细节实际上将它拉下来。当然,那可能是因为我以错误的方式看待它。让我试着用一个假设来解释我的困难:

ASP.NET MVC站点。我有一个带有选项卡式导航的视图。每个标签用于电影类别/流派,显示该类别中电影的5-10个链接。电影数据是通过Netflix的Odata获得的。

我最初的想法是在单击每个选项卡时使用Ajax从正确的OData GET请求中提取和解析JSON。我如何提供非JavaScript版本的?它甚至可能吗?

对于不需要JSON的简单请求 - 例如,让用户登录系统 - 我看到如何设置cookie并根据它动态更改页面以反映更改。但是如果我需要返回并解析JSON呢?我如何提供替代方案?

2 个答案:

答案 0 :(得分:5)

渐进增强的处理是您的服务器端必须能够完全生成所有页面中出现的HTML的最后一部分。这是显而易见的,否则(如果JS被关闭),应用程序的 no 部分就能够执行所述渲染。

由于服务器端必须知道如何呈现所有内容,因此从服务器为您提供的JSON响应生成客户端上的内容(DOM元素/ HTML)没有多大意义。为什么要重复自己?

这给我们得出的逻辑结论是,在客户端上进行动态更新时,您需要从服务器获取现成的HTML(因为渲染逻辑在那里)并根据需要将其插入DOM中。然后,您可以使用jQuery自由处理新插入的元素,并根据需要增强它们。

所以 - 忘记在客户端解析JSON,否则你将自己锁定在渐进增强之外。如果你想打电话给第三方,请让服务器成为你的中间人:给服务器打电话,提供所有必要的信息,以便给第三方打电话,然后回到现成的HTML中。

如果你这样做,那么服务器当然可以提供你网站上所有内容的非JS版本,没有任何问题。实现了对JS的完全不依赖。

答案 1 :(得分:1)

根据定义(JavaScript Object Notation),没有JS没有JSON。如果没有JS,你就不会进行AJAX调用。您的页面将按原样呈现,就像oldschool网站一样。

如果您需要逐步执行此操作,则必须调用odata服务服务器端,并在viewdata或viewmodel中为站点提供.net对象,并让您的views / partials呈现它。

在ASP.Net MVC操作中,通过控制器提供的httpcontext将在此路径上具有一个属性:this.HttpContext.Request.IsAjaxRequest()并且可用于测试是要返回视图还是仅返回json数据,或者任何类型你想要的ActionResult。这可以成为构建渐进增强风格网站的极好节省时间。