2013-09-21 2 views
0

я следующее Simpified ViewModel в C#Связывание observableArray в список C#

public class SearchViewModel 
{ 
    public IList<IdAndNameModel> AvailableTags { get; set; } 
    public IList<IdAndNameModel> SearchTags { get; set; } 
} 

и это в JavaScript:

function ViewModel() { 
    var self = this; 
    self.allTags = ko.observableArray(); 
    self.searchTags = ko.observableArray(); 

    // stuff to fill the searchTags 
} 

var viewModel = new ViewModel(); 
ko.applyBindings(viewModel); 
viewModel.allTags(@Html.Raw(Json.Encode(@Model.AvailableTags))); 

Теперь я хочу, чтобы связать свойство JavaScript в SearchModel:

@Html.HiddenFor(m => m.SearchTags, new { data_bind = "value: searchTags" }) 

Вот фрагмент того, как данные передаются контроллеру:

$('#submitButton').click(function() { 
    var form = $('#criteriaForm'); 
    $.ajax({ 
     url: form.attr('action'), 
     type: form.attr('method'), 
     data: form.serialize(), 
     success: function (result) { 
      // unimportant binding stuff 
     } 
    }); 
}); 

К сожалению, длина списка всегда равен 0. небось причиной является инициализация массива availabaleTags (@Html.Raw(Json.Encode(@Model.AvailableTags))). Я не ошибаюсь? Если я изменил тип из списка на строку, то я вижу, что привязка обычно работает.

Есть ли способ связать списки таким образом?

+0

Когда и как вы проверяете длину списка? Итак, откуда вы знаете, что длина списка всегда равна 0? – nemesv

+0

Сторона контроллера после отправки. – core

+0

ОК, и как вы отправляете свои данные? С помощью обычного тега формы и кнопки отправки или с AJAX? – nemesv

ответ

1

Если бы я тебя, я бы изменить $.ajax вызов выглядеть следующим образом:

$.ajax(form.attr('action'), { 
    type: form.attr('method'), 
    data: JSON.stringify({ 
     'AvailableTags': viewModel.allTags(), 
     'SearchTags': viewModel.searchTags() 
    }), 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    success: function (response) { 
     //Do your thang 
    } 
}); 

Затем контроллер будет иметь метод, который выглядит примерно так:

public ActionResult Test(SearchViewModel searchViewModel) { 
    //Stuffy stuff, best stuff on earth 
} 

Последнее предложение было следует поставить

viewModel.allTags(@Html.Raw(Json.Encode(@Model.AvailableTags))); 

до

ko.applyBindings(viewModel); 
0

В случае, если вы не хотите отправлять их отдельно, возможно, вы захотите попробовать следующее. Примечание. Эта проблема связана с списком C#, поэтому, взаимодействуя со стороной C#, вам нужно будет ее вернуть.

data: JSON.stringify(ko.mapping.toJS(yourobject))

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