Knockout没有正确绑定selectValue

时间:2016-06-23 14:34:10

标签: c# asp.net-mvc-4 knockout-2.0

似乎不可能,我尝试了几种不同的方法来创建一个选择列表并将值绑定到它。

首先,更理想的是,我想用Razor做到这一点:

@Html.DropDownList("SelectedTemplate", Model.Templates, new { @data_bind = "value: Template()" })

选项只是一个字符串数组。当我与Razor绑定时,它是一个SelectListItem对象的List,其Text和Value等于相同的字符串。 所以它呈现如下:

<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>

当我通过Knockout绑定时,模板是一个字符串数组:

var Templates ='["A", "B", "C"]';
我在cshtml文件中生成的

var Templates ='@Html.Raw(Json.Encode(Model.Templates.Select(x=> x.Value)))';

两者都在HTML中创建相同的标记。这会正确呈现选择列表。 Template()打印出正确的值,例如“B”。但是,下拉列表不会选择等于Template()的选项。我也尝试过:

<select name="SelectedTemplate" data-bind="value: Template(), options: JSON.parse(Templates)"></select>

这里的问题相同。我尝试了各种各样的变化:

@Html.DropDownListFor(m => m.SelectedTemplate, Model.Templates, new { @class = "form-control layoutTemplateSelector", @data_bind = "value: Template(), options: JSON.parse(Templates)" })

@Html.DropDownListFor(m => m.SelectedTemplate, Model.Templates, new { @class = "form-control layoutTemplateSelector", @data_bind = "value: Template()" })

@Html.DropDownList("SelectedTemplate", Model.Templates, new { @data_bind = "value: Template(), options: JSON.parse(Templates)" })

理想情况下,我想使用DropDownListFor因为在回帖后我想要m.SelectedTemplate进行处理。

到目前为止,DropDownListFor的回发效果很好,但在加载时它并没有显示data-bind: value:Template(),它肯定包含正确的值。

我也尝试过使用可观察数组但没有成功的想法:

self.SelectedContent({              
            Template: ko.observable(content.Template()),
            TemplateList: ko.observableArray(JSON.parse(Templates))
        });

@Html.DropDownListFor(m => m.Form.Template, Model.Templates, new {@data_bind = "value: Template(), options: TemplateList()" })

任何想法在这里可能是错的?我正在使用Knockout 2.3和MC。

更新

我发现了错误。

从数据库返回的值包含一个空格:“A” 而绑定到下拉列表的值没有那个空格。 这导致了所有错误。

据我所知,最简单的实现现在效果很好:

@Html.DropDownList("SelectedTemplate", Model.Templates, new { @data_bind = "value: Template()" })

尽管这完全是我的错误,但我希望它能帮助将来的某个人。这个错误并不是很明显

0 个答案:

没有答案