1

次のコードがあります。

インデックス.cshtml:

@using System.Web.Script.Serialization
@model MvcApplication3.Models.Person

<script src="../../Scripts/knockout-2.1.0.js" type="text/javascript"></script>

<!-- This is a *view* - HTML markup that defines the appearance of your UI -->
<p>First name: <input data-bind="value: firstName" /></p>
@*<p>Last name: <input data-bind="value: lastName" /></p>*@

<script type="text/javascript">
    var initialData = @Html.Raw(
        new JavaScriptSerializer().Serialize(Model.FirstName));

    alert(initialData);

    // The *viewmodel* - JavaScript that defines data and behavior of the UI
    function AppViewModel() {
        this.firstName = ko.observable(initialData);
        // this.lastName = ko.observable("Bertington");
    }

    // Activates knockout.js
    ko.applyBindings(new AppViewModel());
</script>

ホームコントローラー:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var people = new PeopleEntities();

        var person = people.People.First();

        return View(person);
    }
}

基本的にこれが行うことは、データベースから人をロードし、ノックアウトを使用して名の編集可能なフィールドを作成し、それにロードするFirstNameことです。

これは問題なく動作しますが、LastName. 名だけをシリアライズしているため、これを行う方法がわかりません。モデル全体をシリアライズしたいと考えていますが、各名前にアクセスする方法がわかりません。

4

2 に答える 2

1

JavaScriptSerializer、オブジェクトを JSON 文字列に変換します。initialData.FirstNameモデル全体をシリアル化すると、ドット表記をより具体的に使用して、C# で行うのと同じ方法でそのフィールドにアクセスできますinitialData.LastName

これが機能するinitialDataのは、シリアライザーから取得した JSON 文字列から初期化された JavaScript オブジェクトが含まれているためです。モデルに名と姓のプロパティのみが含まれている場合、これはシリアライザーによって生成される文字列になります。

{"FirstName":"John","LastName":"Doe"}
于 2012-08-09T08:28:57.770 に答える
0

これが私がそれを行う方法です:

var initialData = @(new MvcHtmlString(Model.ToJson()));

var viewModel = new AppViewModel(ko.toJS(initialData));

function AppViewModel(m) {
    this.firstName = ko.observable(m.FirstName);
    this.lastName = ko.observable(m.LastName);
}

$(function () {
    ko.applyBindings(viewModel, document.body);
}

Model の .ToJson() メソッドは拡張メソッドです。

public static class HtmlHelperExtensions
{
    public static string ToJson(this object item)
    {
        return Newtonsoft.Json.JsonConvert.SerializeObject(item);
    }
}

Newtonsoft.Jsonコンバーターを使用したことがわかりますが、おそらく JavaScriptSerializer も使用できます。

于 2012-08-09T22:53:54.440 に答える