2012-06-22 1 views
0

Я использую knockoutjs для рендеринга коллекции предметов. После того, как пользователь может выполнить некоторое встроенное редактирование, мне нужно отправить коллекцию обратно на сервер. Тем не менее, коллекция не заполняется на сервере, потому что я не использую соглашение об именах name = "[0] .Blah". Кто-нибудь знает, как визуализировать атрибуты имен, подобные этому, используя knockoutjs ИЛИ как создать привязку модели, которая позволит мне извлекать значения из ValueProvider?knockoutjs с привязкой к коллекции коллекций mvc

Вы можете увидеть снимок экрана ValueProvider во время отладки ниже.

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

Вот управляемому ViewModel:

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; 
    } 
} 

Вот мой нокаут ViewModel:

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 или новее нокаута, вы можете визуализировать атрибут имени, как следует из наблюдаемого массива.

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

Я проверю это как можно скорее! – devlife

+0

К сожалению, это не работает. Я не понимаю, почему. Кажется, что он содержит правильный HTML: devlife

 Смежные вопросы

  • Нет связанных вопросов^_^