2012-06-22 61 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