代码之家  ›  专栏  ›  技术社区  ›  Herb Caudill

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

  •  13
  • Herb Caudill  · 技术社区  · 14 年前

    假设我正在使用webforms asp.net和jquery构建stackoverflow克隆。问题页下有一个问题、几个答案和评论。要求:

    1. 用户可以发布新的答案和评论,并编辑现有的答案和评论,而无需回发。
    2. 没有更新面板;Ajax调用只检索他们需要的JSON,而不是HTML片段。
    3. 加载页面时,所有现有答案和注释都已就位(不需要运行javascript来读取页面)。

    我想知道的是如何做到这一点,而不必维护两组标记(一组使用某种形式的jquery模板绑定到客户机上,另一组使用传统的webforms绑定到服务器上)。

    我有什么选择?

    7 回复  |  直到 14 年前
        1
  •  1
  •   Stilgar    14 年前

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

        2
  •  1
  •   Aidan Boyle    14 年前

    它不使用jquery,但是 Spark 视图引擎提供 JavascriptViewResult 类,该类允许您在客户端和服务器上呈现模板。这是为您描述的确切情况而设计的。见 this post 作者K.Scott Allen,简单解释了这是如何工作的。

    然后您可以在服务器和客户机上使用相同的视图页。在服务器上,您将一个viewModel对象传递给视图,在客户机上,您将一个json对象传递给它。您甚至可以在视图中包含代码,只要它是C和JavaScript语言的有效代码。 例如 var x = 1; 将在C_和JavaScript中编译。

        3
  •  1
  •   Paddy    14 年前

    我不知道这是否可能是一个选项,但使用ASP.NET MVC会变得相对简单。例如,您有答案的部分视图,这是页面标记的一部分。然后,您的控制器上也会有一个动作,例如,一个应答ID,它只是从该部分视图返回呈现的HTML,然后可以将其放入文档中。

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

        4
  •  0
  •   Sam Saffron James Allen    14 年前

    你可以使用 javscriptdotnet embeddedjs

    这样,您就可以在两个地方重用相同的模板。

    就个人而言,我认为这通常是一种过度杀戮。您将引入许多难以管理的依赖项。

        5
  •  0
  •   thorn0    14 年前

    你可以使用 String.format 在scriptmanager加载的脚本中定义的javascript方法(或寻找替代实现 here )它类似于 String.Format NET方法。

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

    格式格式 您可以在客户机和服务器上呈现此模板。别忘了为javascript正确地转义它。

        6
  •  0
  •   Richard Marskell - Drackir Sunil Tandon    14 年前

    为什么不使用一个模板HTML文件,从javascript和服务器加载它呢?在javascript中,您只需为使用它的所有项目获取一次HTML模板(将其存储在变量或其他东西中)。

    然后您可以在两者中进行字符串替换,最好只在一个位置进行HTML更新。

        7
  •  0
  •   Steven de Salas Alexander Bollaert    14 年前

    放弃ASP.NET中的所有控件 并且只在JavaScript和CSS中使用HTML标记。

    ASP.NET abstracts the presentation layer 然而,远离开发人员,好消息是,您不必在中使用Web控件来使用.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的bloatware混淆,请尽量减少中间层(例如,尽可能使用ashx“通用处理程序”而不是aspx“页面”)。