【问题标题】:How to avoid duplication of html in client and server side tempates?如何避免客户端和服务器端模板中的 html 重复?
【发布时间】:2012-02-05 04:03:38
【问题描述】:

根据我的经验,似乎在服务器端和客户端模板中有很多 html 重复。客户端是指 Jquery 模板之类的东西,而服务器端是指将服务器端变量与 html 一起使用。

在下面的代码中,foreach 循环在每次页面加载时执行,用于创建项目列表。请注意,它围绕着一个 html 块,其中包含用于动态值的变量占位符。

在 foreach 循环下方,我们有一个具有完全相同 html 结构的 Jquery 模板,唯一不同的是变量语法。

有没有办法“合并”它,这样我就不必在两种情况下重复相同的 html 标记结构?在这两种情况下使用完全相同的 html 块似乎是错误的。

   <h1>Portfolio's</h1>
            <ul id="portfolioList" class="portfolio">
                <% foreach (Portfolio p in Portfolios)
                   {  %>        
                        <li>
                            <span class="delete">[X] </span>
                            <a href="/portfolioDetails.aspx?p=<%=p.PortfolioId %>"><%=p.Name %></a>
                        </li>
                <% } %>
            </ul>

            <!-- portfolio template -->
            <script id="portfolioTemplate" type="text/x-jquery-tmpl">
                <li>
                    <span class="delete">[X] </span>
                    <a href="/portfolioDetails.aspx?p=${PortfolioId}">${Name}</a>
                </li>
            </script>  

【问题讨论】:

    标签: jquery asp.net html templates jquery-templates


    【解决方案1】:

    据我了解,您的 js 模板稍后用于渲染其他投资组合,并通过 AJAX 接收?

    如果是这样,您可以 - 摆脱 js-tmpl 并使用 ajax 预渲染的 html 返回

    -或-

    摆脱服务器端的预渲染,只使用 js。第二个可能是“更干净” - 如果您不想在开始时再发出一个 ajax 请求,您可以始终将初始数据渲染为 json(就像模板一样),并且只在其上运行 js 渲染函数。

    <h1>Portfolio's</h1>
    <ul id="portfolioList" class="portfolio">
    </ul>
    
    <!-- portfolio template -->
    <script id="portfolioTemplate" type="text/x-jquery-tmpl">
        <li>
            <span class="delete">[X] </span>
            <a href="/portfolioDetails.aspx?p=${PortfolioId}">${Name}</a>
        </li>
    </script>
    
    <!-- initial rendering -->    
    <script>
        (function(){
            var initData = [
              <% foreach (Portfolio p in Portfolios) { %>
                { PorfolioId : <%=p.PortfolioId%>, Name : "<%=p.Name%>" },
              <% } %>
            ];
            $("#portfolioTemplate").tmpl(initData).appendTo("#portfolioList");
        }());
    </script>
    

    也许你应该做一些调整,但应该没有问题。

    【讨论】:

    • 您能否举一个例子来说明您避免第二个选项的额外 ajax 请求的技术?
    • 请记住,机器人(例如来自 google)可能不会看到任何东西,因为它们通常不执行 javascript。
    • 我遇到了同样的事情。 Adam 提供的解决方案看起来不错,但不再维护 tmpl 插件。见:github.com/jquery/jquery-tmpl#readme
    • 有几十个基于JS的模板引擎(如Underscore templates),所以放弃jqtmpl没问题。
    • 是的,机器人可能会遇到这样显示的内容问题,但这是所有基于 AJAX 的应用程序的常见问题:/
    【解决方案2】:

    使用嵌套模板或 sn-ps。

    【讨论】:

    • 您能提供更多细节吗?我不确定你的意思
    【解决方案3】:

    您可以使用 hamlc。这对双方都有支持...

    Slim 也是不错的尝试。客户端 slim 称为skim。

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 2016-09-26
      • 2018-08-20
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      相关资源
      最近更新 更多