2012-06-22 62 views
0

我正在使用knockoutjs呈现项目的集合。在允许用户进行一些内联​​编辑之后,我需要将集合发回服务器。但是,该集合没有在服务器上填充,因为我没有使用name =“[0] .Blah”命名约定。有谁知道如何使用knockoutjs渲染名称属性,或者如何创建一个模型绑定器,这将允许我从ValueProvider中提取值?knockoutjs与mvc集合模型绑定

您可以在下面的调试过程中看到ValueProvider的屏幕截图。

http://i.imgur.com/zSU5Z.png

这里是我的管理视图模型:

public class FundLevelInvestmentUploadResult 
{ 
    public string FileName { get; set; } 
    public IList<FundLevelInvestmentViewModel> Items { get; set; } 
    public int NumberOfErrors { get; set; } 

    public bool ShowErrorsOnly { get; set; } 

    public FundLevelInvestmentUploadResult() 
    { 
     Items = new List<FundLevelInvestmentViewModel>(); 
    } 
} 

下面是 “项目” 的管理类:

public class FundLevelInvestmentViewModel 
{ 
    private string _fund; 
    private string _fundType; 
    private string _date; 
    private string _netOfWaivedFees; 
    private string _waivedFees; 
    private string _bcip; 
    private string _fxRate; 

    public uint RowIndex { get; set; } 

    public int? DealCode { get; set; } 
    public bool DealCodeIsValid { get; set; } 

    public string Fund 
    { 
     get { return _fund; } 
     set { _fund = GetString(value); } 
    } 
    public bool FundIsValid { get; set; } 

    public string FundType 
    { 
     get { return _fundType; } 
     set { _fundType = GetString(value); } 
    } 
    public bool FundTypeIsValid { get; set; } 

    public string DateOfInvestment 
    { 
     get { return _date; } 
     set { _date = GetString(value); } 
    } 
    public bool DateOfInvestmentIsValid { get; set; } 

    public string NetOfWaivedFees 
    { 
     get { return _netOfWaivedFees; } 
     set { _netOfWaivedFees = GetString(value); } 
    } 
    public bool NetOfWaivedFeesIsValid { get; set; } 

    public string WaivedFee 
    { 
     get { return _waivedFees; } 
     set { _waivedFees = GetString(value); } 
    } 
    public bool WaivedFeeIsValid { get; set; } 

    public string BCIP 
    { 
     get { return _bcip; } 
     set { _bcip = GetString(value); } 
    } 
    public bool BCIPIsValid { get; set; } 

    public string ExchangeRateToUSD 
    { 
     get { return _fxRate; } 
     set { _fxRate = GetString(value); } 
    } 
    public bool ExchangeRateToUSDIsValid { get; set; } 

    public string FileName { get; set; } 

    private IList<string> _errors; 
    public IList<string> Errors 
    { 
     get { return _errors ?? (_errors = new List<string>());} 
     set { _errors = value; } 
    } 

    public bool Show { get; set; } 

    public FundLevelInvestmentViewModel() 
    { 
     Errors = new List<string>(); 
     Show = true; 
    } 

    // knockoutjs is returning "null" instead of "" for a null object when calling ko.mapping.fromJS 
    private string GetString(string value) 
    { 
     if (value == "null") 
      return string.Empty; 

     return value; 
    } 
} 

这里是我的淘汰赛视图模型:

var viewModel = { 
    FileData: ko.observableArray([]), 

    validateFile: function (file, event) { 
     $.ajax({ 
      type: 'post', 
      url: newUrl, 
      data: ko.mapping.toJS(file) 
     }).done(function (data) { 
      var newFile = ko.mapping.fromJS(data); 
      var index = file.Items.indexOf(file); 
      viewModel.FileData.replace(file, newFile); 
     }); 
    } 
}; 
+0

如果使用'toJSON'发送回服务器,它应该可以工作。你可以发布你的模型? – Tyrsius

+0

我添加了代码@Tyrsius。 – devlife

+0

你尝试过发布'file.FileData'吗? – Tyrsius

回答

1

如果您使用的是版本2.1.0.0或更高版本的knockout,则可以从可观察数组中按如下方式呈现name属性。

<input data-bind='attr: { name: "Items["+$index()+"].DealCode"}' /> 
+0

我会尽快查看! – devlife

+0

不幸的是,这是行不通的。我不明白为什么。 它似乎在提供正确的HTML: devlife