Asp.Net MVC 4 模型绑定和剔除绑定以选择元素

Posted

技术标签:

【中文标题】Asp.Net MVC 4 模型绑定和剔除绑定以选择元素【英文标题】:Asp.Net MVC 4 Model binding AND knockout binding to select element 【发布时间】:2019-07-15 18:10:12 【问题描述】:

我有一个页面,它目前正在使用模型属性作为要从中选择的项目的“列表”,以及一个属性“selectedItems”用于已经选择的项目。 (这是一个多选元素)。

我的问题是,当使用这样的选择元素时:

<select name="SelectedItems" id="SelectedItems" multiple class="form-control chosen-select" data-placeholder="Select Your Items" style="width: 100%">
    @foreach (var item in Model.AvailableItems)
    
        var itemSelected = Model.SelectedItems.Contains(item) ? " selected " : "";
        <option value="@item.ToString()" @itemSelected>@item.Humanize()</option>
    
</select>

它会预先选择合适的项目,并且可用的项目列表是完美的。但是当我去保存/发布时,它无法识别任何更改,因为该元素未包含在淘汰赛绑定中。

所以,当我将它包含在淘汰赛绑定中时,如下所示:

<select name="SelectedItems" id="SelectedItems" multiple class="form-control chosen-select" data-bind="selectedOptions: selectedItems" data-placeholder="Select Your Items" style="width: 100%">
    @foreach (var item in Model.AvailableItems)
    
        var itemSelected = Model.SelectedItems.Contains(item) ? " selected " : "";
        <option value="@item.ToString()" @itemSelected>@item.Humanize()</option>
    
</select>

它不会加载已选择的项目,但会看到尝试保存/发布时所做的更改。

值得注意的是,当我在渲染视图模型的敲除代码(见下文)中放置断点时,就在它执行 ko.applyBindings() 之前,您可以在浏览器中看到它确实具有所选项目正确预选。然后,一旦 ko.applyBindings() 执行,那些预先选择的项目就会消失。

这是我的 cshtml 文件中脚本部分/标签中的淘汰内容:

var viewModelJson = '@Html.Json(Model)';
var viewModelJs = ;
var viewModel = ;
viewModelJs = JSON.parse(viewModelJson);
initializeViewModelJs(viewModelJs);
viewModel = ko.mapping.fromJS(viewModelJs);
ko.applyBindings(viewModel);

我如何让它同时适用于:1) 加载当前选定的项目,以及 2) 查看对选定项目所做的更改?

【问题讨论】:

【参考方案1】:

当页面最初加载并呈现时,因为您将选项标记为选中,所以它们呈现为选中状态。一旦绑定到视图模型,我怀疑 selectedItems 数组是空的,因此不再选择项目并清除它们。

我的解决方案是在视图模型中做所有事情。拥有选项列表,使用options 绑定以及selectedOptions 绑定。因为您正在混合服务器端和客户端代码,这会导致这种行为。

请记住,DOM 是由视图模型控制的。它通过data-bind: 绑定反映视图模型属性的状态。

也许您可以设置 Model 对象的状态,将其转换为 JSON,然后转换为视图模型以匹配您想要的 DOM 的状态或编写 javascript 视图模型。

【讨论】:

以上是关于Asp.Net MVC 4 模型绑定和剔除绑定以选择元素的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc 4,模型绑定改变了线程?

[转] ASP.NET MVC 模型绑定的功能和问题

Asp.Net MVC在过滤器中使用模型绑定

如何在 asp.net MVC 4 Razor 中绑定剑道网格

ASP.NET Core MVC 混合路由/FromBody 模型绑定和验证

ASP.NET MVC学习之模型绑定