asp.net-mvc - 在数组中使用 jqAutocomplete

标签 asp.net-mvc knockout.js knockout-jqautocomplete

我正在使用我想在表格的一行中使用的 jqAutocomplete 插件。

我无法让它工作。不会出现自动完成选择标签。它只允许我输入 1 个字母。

我正在使用 knockout 映射将服务器端 View 模型映射到客户端 View 模型。

页面呈现良好。对于一个新的表格 - 在这种情况下 - 代码产生 10 个空行(不显示)。我想使用自动完成功能从 JobName 列的列表中选择一个契约(Contract)。

我在这里复制了 View 模态,为了更容易理解而减少了;

父 View 模型:

public class WholeViewModel : BaseViewModel
{
    public WholeViewModel(int employeeId, string name;)
        : base()
    {
        this.Lines = new List<LineViewModel>();
        this.Contracts = SessionObjectsSTAS.GetContracts().Select(x => new ContractViewModel { ContractId = x.ContractId, JobName = x.JobName, Label = x.ToString() }).ToList();
        this.EmployeeId = employeeId;
        this.Name = name;
    }

    public int EmployeeId { get; set; }
    public string Name { get; set; }
    public List<ContractViewModel> Contracts { get; set; }
}

Lines Collection 由以下 View 模式组成:
public class LineViewModel
{
    public LineViewModel()
    {
    }

    public LineViewModel(int key)
        : this()
    {
        this.Id = key;
        this.JobName = string.Empty;
        this.Description = string.Empty;
    }

    public int Id { get; set; }
    public int? ContractId { get; set; }
    public string JobName { get; set; }
    public string Description { get; set; }
}

契约(Contract) View 模型:
public class ContractViewModel
{
    public int ContractId { get; set; }
    public string JobName { get; set; }
    public string Label { get; set; }
}

所以对我的javascript:
var lineMapping = {
    'Lines': {
        key: function (line) {
            return ko.unwrap(line.Id);
        },
        create: function (options) {
            return new LineViewModel(options.data);
        }
    }
};

LineViewModel = function (data) {
    var self = this;
    ko.mapping.fromJS(data, lineMapping, self);
};

WholeViewModel = function (data) {
    var self = this;
    ko.mapping.fromJS(data, lineMapping, self);
}; 

和我的 ASP.Net Razor 页面:
@using Newtonsoft.Json
@model ViewModel.WholeViewModel
@{
    var data = JsonConvert.SerializeObject(Model);
}
    <table class="table">
        <tbody data-bind="foreach: Lines">
            <tr>
                <td>
                    <input type="text"
                           data-bind="jqAuto: { source: $parent.Contracts, value: JobName, labelProp: 'Label', inputProp: 'Label', valueProp: 'ContractId' }" />
                </td>
                <td>
                    <input type="text" data-bind="value: Description"  />
                </td>
            </tr>
        </tbody>
    </table>
@section scripts
{
    @Scripts.Render("~/bundles/BootstrapJs")
    @Scripts.Render("~/bundles/jqueryui")
    @Scripts.Render("~/bundles/inputmask")
    @Scripts.Render("~/bundles/Knockout")
    <script type="text/javascript">
        var wholeViewModel = new WholeViewModel(@Html.Raw(data));
        ko.applyBindings(wholeViewModel);
    </script>
}

当我在 Visual Studio 中设置断点时,LineViewModel 看起来像这样;

enter image description here

最佳答案

使用全局变量 data 直接绑定(bind)源。

 <script type="text/javascript">
     var data = @Html.Raw(data);
     var wholeViewModel = new WholeViewModel(data);
     ko.applyBindings(wholeViewModel);
 </script>

映射 child ,线条有一个小错误。将其归因于 Knockout documentation itself .
var LineViewModel = function(data) {
    ko.mapping.fromJS(data, {}, this);
}

请注意, child 被映射到一个空对象而不是 lineMapping 对象。这些对象是 LineViewModel 的一部分,它本身附加到 lineMapping 中的 Lines 数组。

该值应为 ContractId。来源应该是 data.Contracts。
<input type="text"
       data-bind="jqAuto: { 
         source: data.Contracts, 
         value: ContractId, 
         labelProp: 'Label', 
         inputProp: 'Label', 
         valueProp: 'ContractId' 
        }" 
/>

关于asp.net-mvc - 在数组中使用 jqAutocomplete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38610450/

相关文章:

c# - 正则表达式匹配后如何选择n个字符

javascript - 在页面顶部显示标题 - 滚动事件重新触发问题

javascript - 在knockout js中更改服务器的数据

javascript - Knockoutjs 单击并编辑字段不更新 observable

c# - 当 ToString ("0.0") 以 Razor 形式使用整数时,显示整数而不是小数

c# - 如何将asp.net core mvc项目分离成多个程序集(.dll)?

c# - Web API 从小写字母开始序列化属性