4

ノックアウト MVC を使用しています。私のページでは、いくつかの部分ビューをレンダリングします。各部分ビューで、メインのサブモデルであるモデルを渡します。そして、「Uncaught Error: You cannot apply bindings multiple times to the same element.」というエラーが表示されます。ここにいくつかのコードがあります。

メインビュー

@using PerpetuumSoft.Knockout
@model  UserPageViewModel
@{
    var ko = Html.CreateKnockoutContext();
}
<div>
    @Html.Partial("Controls/_PagePanel", Model.PanelViewModel)
</div>
@ko.Apply(Model)

ページ パネルの部分ビュー

@using PerpetuumSoft.Knockout
@model PagePanelViewModel
@{
    var ko = Html.CreateKnockoutContext();
}
<div>
   <div>
      @foreach (var button in Model.Actions)
      {
       @ko.Html.Button(button.Id, button.ActionName, button.ControllerName, null, button.HtmlAttributes)
      }
      <a id="searchGridButton" class="btn" data-toggle="collapse" data-parent="#searchPanel" href="#accordionfilterContainer">Advanced search</a>
  </div>
 @Html.Partial("Controls/_AdvancedSearch", Model.AdvancedSearch)
</div>
@ko.Apply(Model)

詳細検索 部分表示

@using PerpetuumSoft.Knockout
@model  AdvancedSearchViewModel
@{
    var ko = Html.CreateKnockoutContext();
}
<div id="accordionfilterContainer" class="accordion-body collapse">
    @using (ko.Html.Form(Model.ActionName, Model.ControllerName, null, new { id = "searchForm" }))
    {
        <div id="filterContainer" class="accordion-inner">
             @using (var items = ko.Foreach(m => m.SearchCriteria))
             {
                <div style="display: inline-block">
                    <span @items.Bind.Text(m => m.Id)></span>
                    <br />
                    @items.Html.TextBox(m => m.Value, null)
                </div>
             }
            <div style="display: inline-block">
                <button type="submit" class = "@Model.HtmlAttributes">Apply filters</button>
            </div>
      </div>
    }
</div>
@ko.Apply(Model)

モデル

public class UserPageViewModel
{
    public List<User> Data { get; set; }

    public PagePanelViewModel PanelViewModel { get; set; }
}


public class PagePanelViewModel
{

    public IEnumerable<ButtonViewModel> FilterButtons { get; set; }

    public AdvancedSearchViewModel AdvancedSearch { get; set; }

    public IEnumerable<ButtonViewModel> Actions { get; set; }
}


public class AdvancedSearchViewModel 
{
    public IList<TextBoxViewModel> SearchCriteria { get; set; }
}

問題が @ko.Apply() 文字列にあることは理解していますが、その理由はわかりません。問題を解決する方法はありますか?

4

1 に答える 1

1

問題は解決された。部分ビューをレンダリングする場合は @ko.With() を使用する必要があります。

<div>
@using (var subModel = ko.With(m => m.PanelViewModel))
{
    @Html.Partial("Controls/_PagePanel", Model.PanelViewModel)
}
</div>

@ko.With() は、サブモデルのプロパティをバインドする必要がある部分ビューを指定します。次に、ルート ページ (メイン ビュー) の 1 つを除いて、すべての @ko.Apply(Model) を削除する必要があります。

于 2013-09-02T08:39:53.457 に答える