使用JQuery或其他类似框架从自定义url /Web服务加载HTML内容非常容易。到目前为止,我已经多次使用这种方法,并发现性能令人满意。

但是所有的书,所有的专家都试图让我使用JSON而不是生成的HTML。它为什么比HTML更优越?

它会快很多吗? 它在服务器上的负载是否非常小?

另一方面,我有一些使用生成HTML的理由。

它是简单的标记,通常和JSON一样紧凑,甚至更紧凑。 它更不容易出错,因为你得到的都是标记,而不是代码。 在大多数情况下,编程会更快,因为你不必为客户端单独编写代码。

你站在哪一边,为什么?


当前回答

I have something interesting I thought I might add. I developed an application that only ever loaded a full view one time. From that point forward it communicated back to the server with ajax only. It only ever needed to load one page (my reason for this is unimportant here). The interesting part comes in that I had a special need to return some data to be operated on in the javascript AND a partial view to be displayed. I could have split this up into two calls to two separate action methods but I decided to go with something a little more fun.

看看吧:

public JsonResult MyJsonObject(string someData)
{
     return Json(new { SomeData = someData, PartialView = RenderPartialViewToString("JsonPartialView", null) }, JsonRequestBehavior.AllowGet);
}

你可能会问RenderPartialViewToString()是什么?就是这个小块的酷:

protected string RenderPartialViewToString(string viewName, object model)
{
     ViewData.Model = model;

     using (StringWriter sw = new StringWriter())
     {
          ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
          ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
          viewResult.View.Render(viewContext, sw);

          return sw.GetStringBuilder().ToString();
     }
}

我还没有做任何性能测试,所以我不确定它是否招致任何更多或更少的开销调用一个动作方法为JsonResult和一个为ParticalViewResult,但我仍然认为这是相当酷的。它只是将一个局部视图序列化为一个字符串,并将它与Json作为参数之一一起发送。然后,我使用JQuery来获取该参数,并将其打到适当的DOM节点:)

告诉我你对我的混血儿有什么看法!

其他回答

这取决于具体情况。

有时,避免使用JSON是必要的。 例如,当我们的程序员在用js编程时遇到困难。

我的经验告诉我:使用ajax服务比使用内联JSON更好。

迟早js会成为一个问题

我认为这取决于设计的结构,使用JSON比使用HTML更吸引人,但问题是如何处理它,使其易于维护。

例如,假设我有一个使用整个网站相同html/风格的列表页面,我将编写全局函数来格式化html的这些部分,我所要做的就是将JSON对象传递到函数中。

我主要同意这里的观点。我想总结一下:

如果您最终要在客户端解析HTML以对其进行一些计算,那么发送HTML是一种糟糕的做法。 如果您最终所做的只是将JSON合并到页面的DOM树中,那么发送JSON是一种糟糕的做法。

I have something interesting I thought I might add. I developed an application that only ever loaded a full view one time. From that point forward it communicated back to the server with ajax only. It only ever needed to load one page (my reason for this is unimportant here). The interesting part comes in that I had a special need to return some data to be operated on in the javascript AND a partial view to be displayed. I could have split this up into two calls to two separate action methods but I decided to go with something a little more fun.

看看吧:

public JsonResult MyJsonObject(string someData)
{
     return Json(new { SomeData = someData, PartialView = RenderPartialViewToString("JsonPartialView", null) }, JsonRequestBehavior.AllowGet);
}

你可能会问RenderPartialViewToString()是什么?就是这个小块的酷:

protected string RenderPartialViewToString(string viewName, object model)
{
     ViewData.Model = model;

     using (StringWriter sw = new StringWriter())
     {
          ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
          ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
          viewResult.View.Render(viewContext, sw);

          return sw.GetStringBuilder().ToString();
     }
}

我还没有做任何性能测试,所以我不确定它是否招致任何更多或更少的开销调用一个动作方法为JsonResult和一个为ParticalViewResult,但我仍然认为这是相当酷的。它只是将一个局部视图序列化为一个字符串,并将它与Json作为参数之一一起发送。然后,我使用JQuery来获取该参数,并将其打到适当的DOM节点:)

告诉我你对我的混血儿有什么看法!

根据您的UI,您可能需要更新DOM中的两个(或多个)不同元素。如果你的响应是HTML格式的,你会解析它来确定内容在哪里吗?或者你也可以使用JSON散列。

你甚至可以结合它,返回一个JSON w/ html数据:)

{ 'dom_ele_1' : '<p>My HTML part 1</p>', 'dome_ele_2' : '<div>Your payment has been received</div>' }