0

サーバー側のビューモデルをクライアント側のビューモデル (knockout.js 用) に渡そうとすると、「Uncaught SyntaxError: Unexpected token &」という js エラーが発生します。

ビューモデル

public class InvoiceViewModel
{
        public Factuur Factuur { get; set; }
        public List<Factuurlijn> Factuurlijnen { get; set; }
}

コントローラ

        //Create Viewmodel
        InvoiceViewModel ivm = new InvoiceViewModel();

        //Initialize vm objects
        int aantaldagentotvervaldatum = Convert.ToInt32(General.getParameter("defaultaantaldagentotvervaldatum"));

        Factuur i = new Factuur { factuur_nummer = 1, factuur_nummervoorvoegsel = DateTime.Now.Year.ToString(), factuur_datum = DateTime.Now, factuur_type = Ftype, factuur_vervaldatum = DateTime.Now.AddDays(aantaldagentotvervaldatum), factuur_kortingspercentage = Convert.ToDecimal(General.getParameter("defaultkortingspercentage")) };

        List<Factuurlijn> FLijnen = new List<Factuurlijn>{new Factuurlijn(){ factuurlijn_aantal = 0, factuurlijn_item="", factuurlijn_prijs=0 }};

        // add objects to viewmodel
        ivm.Factuur = i;
        ivm.Factuurlijnen = FLijnen;

        return View(ivm);

意見

    @{
        //prepare viewmodel to assign to pas into js
        string initialData = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model);

    }

...

<script type="text/javascript">
    var initialDataJS = @(initialData)
    alert('initialdata : ' + initialDataJS);
</script>

アラートがトリガーされず、エラーが表示されます。

in FF :クリアされたスコープでコンパイル アンド ゴー スクリプトを実行しようとします

Chrome : Uncaught SyntaxError: Unexpected token &

ビューモデルをjs変数に割り当てようとする前に、ビューモデルのシリアル化で問題が発生する気がしますが、その理由がわかりません...

私はすでに試しました

string initialData = Json.Encode(Model);

しかし成功しません...その後、jsエラーでこれを見ました

エラー: プロパティ ID が無効です

var initialDataJS = {&quot;Factuur&quot;:{&quot;factuur_id&quot;:0,&quot;factuur_nummervoorvoegsel&quot;:&quot;2012&quot;,&quot;factuur_nummer&quot;:1,&quot;factuur_type&quot;:&quot;F&quot;,&quot;bedrijf_id&quot;:0,&quot;factuur_naam&quot;:null,&quot;factuur_notities&quot;:null,&quot;factuur_details&quot;:null,&quot;factuur_datum&quot;:&quot;\/Date(1335443889648)\/&quot;,&quot;factuur_vervaldatum&quot;:&quot;\/Date(1336307889648)\/&quot;,&quot;factuur_kortingspercentage&quot;:0,&quot;factuur_betaald&quot;:false,&quot;factuur_bedrijf_naam&quot;:null,&quot;factuur_bedrijf_adres&quot;:null,&quot;factuur_bedrijf_postcode&quot;:null,&quot;factuur_bedrijf_gemeente&quot;:null,&quot;factuur_bedrijf_land&quot;:null,&quot;factuur_bedrijf_tel&quot;:null,&quot;factuur_bedrijf_fax&quot;:null,&quot;factuur_bedrijf_gsm&quot;:null,&quot;factuur_bedrijf_email&quot;:null,&quot;factuur_bedrijf_website&quot;:null,&quot;factuur_bedrijf_btw&quot;:null,&quot;factuur_deleted&quot;:false,&quot;bedrijf&quot;:null,&quot;bedrijfReference&quot;:{&quot;Value&quot;:null,&quot;EntityKey&quot;:null,&quot;RelationshipName&quot;:&quot;ScotaModel.facturen_ibfk_1&quot;,&quot;SourceRoleName&quot;:&quot;facturen&quot;,&quot;TargetRoleName&quot;:&quot;Bedrijf&quot;,&quot;RelationshipSet&quot;:null,&quot;IsLoaded&quot;:false},&quot;factuurlijnen&quot;:[],&quot;EntityState&quot;:1,&quot;EntityKey&quot;:null},&quot;Factuurlijnen&quot;:[{&quot;factuurlijn_id&quot;:0,&quot;factuur_id&quot;:0,&quot;factuurlijn_item&quot;:&quot;&quot;,&quot;factuurlijn_aantal&quot;:0,&quot;factuurlijn_prijs&quot;:0,&quot;factuurlijn_btwbedrag&quot;:0,&quot;factuurlijn_btwpercentage&quot;:0,&quot;factuurlijn_datum&quot;:&quot;\/Date(-62135596800000)\/&quot;,&quot;factuurlijn_volgorde&quot;:null,&quot;factuurlijn_deleted&quot;:false,&quot;facturen&quot;:null,&quot;facturenReference&quot;:{&quot;Value&quot;:null,&quot;EntityKey&quot;:null,&quot;RelationshipName&quot;:&quot;ScotaModel.factuurlijnen_ibfk_1&quot;,&quot;SourceRoleName&quot;:&quot;factuurlijnen&quot;,&quot;TargetRoleName&quot;:&quot;facturen&quot;,&quot;RelationshipSet&quot;:null,&quot;IsLoaded&quot;:false},&quot;EntityState&quot;:1,&quot;EntityKey&quot;:null}]}

誰か助けてくれませんか?

4

2 に答える 2

1

変化する

var initialDataJS = @(initialData)

var initialDataJS = @Html.Raw(initialData)

PhilHaackからhttp://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx

Razorはこれらすべての引用符を安全にエンコードしようとしていますが、実際にはJavascriptに必要です。

于 2012-04-26T14:27:00.340 に答える
0

引用文字を置き換える必要があります。これが私がすることです

    var jsonStr = '@(Model.JSONData)';
    var json = JSON.parse(jsonStr.replace(/&quot;/g, '"'));

    viewModel = new JsModel(json);
    ko.applyBindings(viewModel);

したがって、この例では、サーバーからのデータをjsonStr変数の文字列として保存し、正規表現を使用して二重引用符を置き換えて解析します。これにより、jsonオブジェクトが作成されます。

于 2012-06-12T15:07:10.777 に答える