Установка начального значения нокаутируемой модели с помощью бритвы - PullRequest
3 голосов
/ 07 ноября 2011

Мне кажется странным, что я не могу найти никакой информации о том, как динамически заполнить модель представления Knockout. Я думаю, что мои условия поиска неверны или что-то в этом роде.

В любом случае, поскольку я использую Asp.Net MVC 3 и в первый раз собираюсь использовать нокаут только для одной конкретной страницы, я надеялся, что смогу каким-то образом использовать модель Razor для вставки в нокаут.

@Html.TextBoxFor(m => m.PropertyName, new { data_bind = "value: name" })

Я полагал, что это не сработало, потому что, даже если бритва заполняет поле PropertyName, это происходит до привязки, поэтому оно не приводит к принудительному изменению значения для модели вида нокаута.

        var viewModel = {
        name: ko.observable(@GetPoertyNameUsingRazorSomehow)
    };

Это тоже не работает, по крайней мере, во всяком случае, я так понимаю.

Поскольку мы можем легко получить данные RazorModel с помощью MVC 3, как обычно, я был уверен, что мы каким-то образом сможем внедрить их в представление Knockout viewModel. Я не видел ни одного учебника, объясняющего как. Чего мне не хватает?

Ответы [ 2 ]

4 голосов
/ 07 ноября 2011

Я создал небольшую библиотеку поверх Json.NET именно для такого случая:

https://github.com/paultyng/FluentJson.NET

Вы можете создать JSON в виде Razor следующим образом (обратите внимание на расширение Knockout)методы):

@JsonObject.Create()
    .AddProperty("name", "value")
    .AddProperty("childObject", c => {
        .AddProperty("childProperty", "value2")
    })
    .AddObservable("knockoutProperty", 123)

Это приведет к созданию JSON, аналогичному следующему:

{"name":"value","childObject":{"childProperty":"value2"},"knockoutProperty":ko.observable(123)}

Методы Knockout добавляются с помощью методов расширения, и другие вещи могут легко расширяться.

Пакет на Nu-Get, если хотите.

3 голосов
/ 07 ноября 2011

Если имя вашего свойства должно быть строкой, это будет работать, если вы заключите @GetPoertyNameUsingRazorSomehow в кавычкиВ противном случае вы передаете неопределенный объект в наблюдаемую область.

name: ko.observable('@GetPoertyNameUsingRazorSomehow')
...