Asp.net mvc 无法多次应用绑定-在布局和内容页中绑定ViewModel时

Asp.net mvc 无法多次应用绑定-在布局和内容页中绑定ViewModel时,asp.net-mvc,knockout.js,Asp.net Mvc,Knockout.js,我正在尝试将我的MVC应用程序的_布局页面转换为使用淘汰的viewmodel,而不是Razor语法。到目前为止,我的所有内容页都有如下语法来呈现javascript视图模型(用于索引视图): $(文档).ready(ko.applyBindings)(新索引虚拟机( @Html.Raw(JsonConvert.SerializeObject(模型,新JsonSerializerSettings(){ContractResolver=new CamelCasePropertyNamesContr

我正在尝试将我的MVC应用程序的_布局页面转换为使用淘汰的viewmodel,而不是Razor语法。到目前为止,我的所有内容页都有如下语法来呈现javascript视图模型(用于索引视图):


$(文档).ready(ko.applyBindings)(新索引虚拟机(
@Html.Raw(JsonConvert.SerializeObject(模型,新JsonSerializerSettings(){ContractResolver=new CamelCasePropertyNamesContractResolver()}щщ));
到目前为止,这一直很有效。现在,在我的布局中,我尝试对以下内容使用相同的方法:

<script type="text/javascript">
$(document).ready(ko.applyBindings(new LayoutVm(
    @Html.Raw(JsonConvert.SerializeObject(ViewBag, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() })))));
</script>

$(文档).ready(ko.applyBindings)(新布局虚拟机(
@Html.Raw(JsonConvert.SerializeObject(ViewBag,新的JsonSerializerSettings(){ContractResolver=new CamelCasePropertyNamesContractResolver()}()()));
如果内容页没有内部viewmodel声明,则可以这样做。但是,当我加载索引页面(包含第一个代码段)时,我得到以下结果:

<script type="text/javascript">
$(document).ready(ko.applyBindings(new LayoutVm(
    @Html.Raw(JsonConvert.SerializeObject(ViewBag, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() })))));
</script>
未捕获错误:不能对同一元素多次应用绑定


我有点困惑,为什么这不起作用。任何帮助都将不胜感激

ko.applyBindings
可以采用两个参数,第一个是viewmodel,第二个是要设置的绑定上下文的可选根节点。如果未提供任何值,则根节点默认值为
window.document.body
。如果您两次调用applyBindings而没有指定不同的根节点,那么它将给出您收到的错误

请记住,您不希望重叠正在绑定的节点。如果需要为两个单独的ViewModel调用applyBindings两次,则必须指定要绑定到的不同元素:

ko.applyBindings(new MenuVM(), document.getElementById('menu'));
ko.applyBindings(new ContentVM(), document.getElementById('sub-content'));
编辑 根据rwisch45的评论,一个选项是将单个viewmodel绑定到整个页面,并在主viewmodel中设置子viewmodels


ko.applyBindings
可以采用两个参数,第一个是viewmodel,第二个是要设置的绑定上下文的可选根节点。如果未提供任何值,则根节点默认值为
window.document.body
。如果您两次调用applyBindings而没有指定不同的根节点,那么它将给出您收到的错误

请记住,您不希望重叠正在绑定的节点。如果需要为两个单独的ViewModel调用applyBindings两次,则必须指定要绑定到的不同元素:

ko.applyBindings(new MenuVM(), document.getElementById('menu'));
ko.applyBindings(new ContentVM(), document.getElementById('sub-content'));
编辑 根据rwisch45的评论,一个选项是将单个viewmodel绑定到整个页面,并在主viewmodel中设置子viewmodels


ko.applyBindings
可以采用两个参数,第一个是viewmodel,第二个是要设置的绑定上下文的可选根节点。如果未提供任何值,则根节点默认值为
window.document.body
。如果您两次调用applyBindings而没有指定不同的根节点,那么它将给出您收到的错误

请记住,您不希望重叠正在绑定的节点。如果需要为两个单独的ViewModel调用applyBindings两次,则必须指定要绑定到的不同元素:

ko.applyBindings(new MenuVM(), document.getElementById('menu'));
ko.applyBindings(new ContentVM(), document.getElementById('sub-content'));
编辑 根据rwisch45的评论,一个选项是将单个viewmodel绑定到整个页面,并在主viewmodel中设置子viewmodels


ko.applyBindings
可以采用两个参数,第一个是viewmodel,第二个是要设置的绑定上下文的可选根节点。如果未提供任何值,则根节点默认值为
window.document.body
。如果您两次调用applyBindings而没有指定不同的根节点,那么它将给出您收到的错误

请记住,您不希望重叠正在绑定的节点。如果需要为两个单独的ViewModel调用applyBindings两次,则必须指定要绑定到的不同元素:

ko.applyBindings(new MenuVM(), document.getElementById('menu'));
ko.applyBindings(new ContentVM(), document.getElementById('sub-content'));
编辑 根据rwisch45的评论,一个选项是将单个viewmodel绑定到整个页面,并在主viewmodel中设置子viewmodels


您必须了解,在将HTML文档发送到浏览器之前,ASP.NET将在服务器上完成某些任务。它将解释Razor语句,并将部分视图、视图和布局组装到服务器上的单个HTML文档中

敲除是在客户端(浏览器)上工作的框架。如果在\u Layout.cshtmlIndex.cshtml中应用绑定,则在汇编的HTML文档中应用绑定两次。在Knockout中,不能在同一个HTML元素上多次应用绑定

您需要做的是向某些HTML元素添加一个具有有意义值的id属性。然后,需要向不同的ko.applyBindings添加第二个参数,该参数将是元素id


现在,如果存在嵌套元素,则始终可以自己控制降序绑定。您可以指定一条语句,该语句将停止父元素与子元素的绑定。在上了解更多信息。

您必须了解,在将HTML文档发送到浏览器之前,ASP.NET将在服务器上完成某些任务。它将解释Razor语句,并将部分视图、视图和布局组装到服务器上的单个HTML文档中

敲除是在客户端(浏览器)上工作的框架。如果在\u Layout.cshtmlIndex.cshtml中应用绑定,则在汇编的HTML文档中应用绑定两次。在Knockout中,不能在同一个HTML元素上多次应用绑定

您需要做的是添加一个带有
<script type="text/javascript">
$(document).ready(ko.applyBindings(new LayoutVm(
@Html.Raw(JsonConvert.SerializeObject(ViewBag, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }))), document.getElementById('layout')));
</script>