在多页 WebForms 项目中使用 VueJS

Posted

技术标签:

【中文标题】在多页 WebForms 项目中使用 VueJS【英文标题】:Using VueJS in multipage WebForms project 【发布时间】:2019-04-04 16:52:15 【问题描述】:

我有一个网络表单项目,我想在其中使用 VueJS,但在设置根元素时遇到问题。

如果我将我的内容包装在 <div id="app"></div> 元素中并将其传递给 Vue 实例:

 new Vue(
    el: '#app',
    components: 
        foo
    ,
    data: 
    ,
    methods: 
    
);

带有测试组件如:

var foo = Vue.component('foobar', 
    props: [
        'title'
    ],
    data: function () 
        return 
        ;
    
);

还有一个示例组件内联模板:

<foobar inline-template title="Hello world">
    <div>
        <h1>title</h1>
    </div>
</foobar>

我最终得到一个 Vue 控制台错误,因为它试图将页面的全部内容解析为 Vue 模板,并且在某些脚本管理器脚本上失败并出现错误 [Vue warn]: Error compiling template:

<div id="app">
    <script type="text/javascript">
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('ctl00$manScript', 'aspnetForm', 
['tctl00$ctxM','','tctl00$pnlMessagePlaceholder$pMP',''], [], [], 90, 
'ctl00');
//]]>
</script>

如何在 Web 表单项目中包含 VueJS 并避免这些模板解析错误?

【问题讨论】:

您是否尝试过在 Web 表单页面的头部引用您的捆绑包?然后 Vue 应该能够将应用程序注入到#app 元素中。 @Jelle - 抱歉,我不确定你的意思。脚本已经在头部引用了,我刚刚得到了包裹整个页面内容的&lt;div id="app"&gt; 元素,Vue 将如何注入内容?我已将组件设置为 inline-template 类型,以允许它们在标准的 asp.net 用户控件中使用。 【参考方案1】:

就 Vue.js 而言,您提供的代码如下所示:

html文件

<div id="app">
<foo-component title="Hello world">   
</foo-component>
</div>

javascript 文件

var foo = Vue.component('foo-component', 
    props: [
        'title'
    ],
    data: function () 
        return 
        ;
    ,
  template:` <div>
        <h1>title</h1>
    </div>`
    );

new Vue(
    el: '#app'
);

您已将组件注册为 foo-component,但随后您调用了“foobar”。此外,您的 Vue 实例应该在您创建组件之后放置,以便它识别它。

【讨论】:

抱歉给您带来了困惑 - foobar / foo-component 只是一个错字,我会更正。该组件也是在 Vue 实例之前创建的。【参考方案2】:

不确定是否有官方建议的解决方案。像这样使用它可能只是一个不好的做法。摆脱警告的一种巧妙方法是在执行 Vue 代码之前使用 javascript 将脚本标签重新定位到文档正文的底部:

const scripts = document.querySelector('#app').querySelectorAll('script');
for (let i = 0; i < scripts.length; i++) 
   document.body.appendChild(scripts[i]);

【讨论】:

谁投了反对票,请给个理由?【参考方案3】:

这是一个工作示例。它所做的一切都将您包含在问题中的部分组合起来。它只是工作。我没有遇到你的问题,所以我不知道你做错了什么。最好再包含一个example per our guidelines,而不仅仅是部分片段——在我们的游戏中,魔鬼在细节中,而且它通常很愚蠢,我相信你知道:)

为了简单起见,我把js直接放到了页面中,所以这就是全部了。 (后面的代码就是生成的空类)。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="scripts/vue.js"></script>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <div id="app">
                <foobar inline-template title="Hello world">
                    <div>
                        <h1>title</h1>
                    </div>
                </foobar>
                <script>
                    Vue.component('foobar', 
                        props: [
                            'title'
                        ],
                        data: function () 
                            return 
                            ;
                        
                    );
                    new Vue(
                        el: '#app',
                        //components: 
                        //    foo
                        //,
                        data: 
                        ,
                        methods: 
                        
                    );
                </script>
            </div>
        </div>
    </form>
</body>
</html>

【讨论】:

您误解了这个问题 - 阅读有关 Vue 尝试解析根元素中的嵌套脚本的内容,例如webforms &lt;script&gt; 由更新面板等生成的标签......你的例子不包括这个,所以它当然可以工作。这是一个非常老的问题,我最终通过为每个“事物”设置一个 Vue 根而不是将整个页面包装在单个根元素中来解决我的问题。

以上是关于在多页 WebForms 项目中使用 VueJS的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ghostscript 在多页 pdf 中裁剪第 3 和第 4 页

在多页pdf的流程中附加一个块

如何在多页 vue 应用程序中的页面之间传输状态?

将用户输入数据保存在多页 php 表单中

如何阻止用户在多页测验中编辑网址?

在多页网格视图中获取行数?