ASP.NET MVC、JSON 和非 JavaScript 客户端

Posted

技术标签:

【中文标题】ASP.NET MVC、JSON 和非 JavaScript 客户端【英文标题】:ASP.NET MVC, JSON & non JavaScript clients 【发布时间】:2010-09-24 02:58:16 【问题描述】:

我需要确保我正在开发的应用程序是可访问的,并且在关闭 javascript 的情况下也可以工作。我只需要一个指针来帮助完成以下工作。

我有 3 个“链式”选择框,我希望启用 JavaScript 的客户端能够获得良好的 Ajax 体验。我可以使用带有 WCF 服务的 jQuery 和 JSON 轻松编写所需的功能来填充前面选择的更改事件上的链接框。但是非 JavaScript 客户端呢?

我会在选择旁边包装一个提交并将它们放在自己的表单中以使用特定操作或不同的查询字符串参数回发吗?同一个控制器能否给我一个部分 JSON 响应以及提供完整的 html 响应。谁能给我指出一个很好的演示,它利用 JSON 和普通 HTTP 帖子在 ASP.NET MVC 中产生相同的结果。我看到的所有 ASP.NET MVC 演示/示例都忘记了不支持 JavaScript 的客户端。

更新

但是,如果我正确阅读了使用 Microsoft Ajax 客户端库的 Ajax 调用,情况并非如此 - 我想避免并仅使用 jQuery - 抱歉应该提到这一点。

另外,我不希望在控制器中到处都出现这种噪音(让我想起来自 webforms 的 ispostback...不寒而栗)。

很遗憾,我没有可以在控制器上使用的属性,例如 [AcceptVerbs(HttpVerbs.Post)],但对于内容类型,例如 [AcceptType(httpTypes.Json)]。

肯定有比到处使用 if 语句更好的方法.....

【问题讨论】:

【参考方案1】:

您可以检查 IsMvcAjaxRequest 属性并在控制器中使用它,然后如果为 true,则返回部分视图(用户控件)或 JSON 结果,如果为 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(...);
   
  

更多信息在这里:MVC AJAX Sites That Gracefully Degrade

【讨论】:

【参考方案2】:

(参考您之前的答案):您可以在 Request.Form 中传递一个值来表示这是一个启用或不启用 javascript 的浏览器,然后创建一个控制器工厂,该工厂将根据您的内容实例化适当的控制器进入 Request.Form;常规请求的默认控制器(启用 javascript 的浏览器)和仅返回完整视图的“后备控制器”。我不确定拥有两倍数量的控制器是否比围绕单个控制器的 if-else 语句更好,但我想这是个人喜好问题。

打赌有更简单的解决方案,不过..我希望这个问题有更多的曝光。

【讨论】:

这里也是极客。如果您发现更多信息,也许您可​​以告诉我……反之亦然。我确实就此联系了 phil haack 并进行了一些对话。如果您愿意,我很乐意分享信息

以上是关于ASP.NET MVC、JSON 和非 JavaScript 客户端的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JSON.NET 通过 ASP.NET MVC 传递 JSON 日期值? [复制]

在 ASP.NET 中使用 WebAPI 或 MVC 返回 JSON

JSON 和 ASP.NET MVC

ASP.NET MVC 下自定义 JsonResult,使用 Json.NET 序列化 JSON

ASP.NET MVC 返回 Json 结果?

asp.net mvc3 返回多个json列表