似乎不可能,我尝试了几种不同的方法来创建一个选择列表并将值绑定到它。
首先,更理想的是,我想用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()" })
尽管这完全是我的错误,但我希望它能帮助将来的某个人。这个错误并不是很明显