具有匹配客户端和服务器端标记的ASP.NET页面选项?

时间:2010-10-17 22:44:09

标签: asp.net jquery ajax

假设我正在使用webforms ASP.NET和jQuery构建StackOverflow克隆。问题页面下面有一个问题,几个答案和评论。要求:

  1. 用户可以发布新的答案和评论,并编辑现有答案和评论,而无需回发。
  2. 没有UpdatePanels; AJAX调用只检索他们需要的JSON,而不是HTML片段。
  3. 页面加载所有现有答案和评论(不需要运行javascript来阅读页面)。
  4. 我想弄清楚的是如何在不必维护两组标记的情况下执行此操作(一组使用某种形式的jQuery模板绑定在客户端上,另一组使用传统的WebForms绑定在服务器上)。

    我有什么选择?

7 个答案:

答案 0 :(得分:1)

它不使用jQuery,但Spark视图引擎提供了一个JavascriptViewResult类,允许您在客户端和服务器上呈现模板。这适用于您描述的确切情况。请参阅K. Scott Allen的this post,了解其工作原理的简单说明。

然后,您可以在服务器和客户端上使用相同的View页面。在服务器上,您将viewmodel对象传递给视图,并在客户端上传递JSON对象。您甚至可以在视图中包含代码,只要它是C#和JavaScript语言的有效代码即可。 例如,var x = 1;将在C#和Javascript中编译。

答案 1 :(得分:1)

虽然它并不完全是您所要求的,但您可能需要考虑通过服务(不使用更新面板)在服务器上呈现HTML并将其发送到客户端而不是使用客户端模板。这可不是那么糟糕,因为Facebook正在这样做: http://www.facebook.com/video/video.php?v=596368660334 如果它适合你的情况取决于你的标记有多丰富,通过网络发送的数据的百分比将是标记而不是内容。

答案 2 :(得分:1)

我不知道这是否可能是一个选项,但使用ASP.net MVC这变得相对微不足道。例如,您有一个部分的答案视图,这是页面上标记的一部分。然后,您还可以在控制器上执行操作,例如一个答案id,只返回该局部视图中呈现的html,然后可以将其插入到文档中。

我在一些地方使用过它,发现它是一种非常干净的方法。

答案 3 :(得分:0)

您可以将javscriptdotnetembeddedjs

结合使用

通过这种方式,您可以在两个地方重复使用相同的模板。

就我个人而言,我认为这通常是一种矫枉过正。您将介绍很多难以管理的依赖项。

答案 4 :(得分:0)

您可以使用String.format JavaScript方法,该方法在ScriptManager加载的脚本中定义(或寻找替代实现here)。它类似于String.Format .Net方法。

string CommentTpl = "<div class='comment {0}'>{1}</div>";

使用String.format,您可以在客户端和服务器上呈现此模板。只是不要忘记为JavaScript正确地逃避它。

答案 5 :(得分:0)

为什么不使用模板html文件并从JavaScript和服务器加载它?在JavaScript中,您可以为其使用的所有项目获取一次HTML模板(将其存储在变量或其他内容中)。

然后,您可以在两者中进行字符串替换,并且只使用一个地方进行HTML更新。

答案 6 :(得分:0)

抛弃ASP.NET中的所有控件,并仅使用带有Javascript和CSS的HTML标记。

ASP.NET abstracts the presentation layer远离开发人员,但好消息是你不必使用网页控件来编写一个使用.NET的漂亮网站。请仔细阅读帖子:“don’t throw the baby (.NET) out with the bath water (ASP.NET)”。

您仍然可以保留.NET,以便在前端和数据库之间传递信息(使用JSON而不是回发),并处理客户端无法处理的其他逻辑,如安全性和登录。

保持简单,同时仍然动态添加标记,以便您的页面自动加载内容,如下所示:

<% foreach (Post post in PostList) { %>
<h2><%= post.Title %></h2>
<p><%= post.Content %></p>
<% } %>

基本上,如果您不想开始与无偿的ASP.NET标记混淆并添加像ViewState这样的英国媒体报道软件,请将中间层保持在最低限度(例如,尽可能使用ashx“Generic Handlers”而不是aspx“Pages”)。