2012-04-26 17 views
0

私はJSエラー "キャッチされないでSyntaxError:予期しないトークン&" を持って、私は(knockout.js用)クライアント側のviewmodelに私のサーバーサイドのviewmodelを渡すしようとすると、MVCのViewModel> JSのViewModel - キャッチされないでSyntaxError:予期しないトークン&

ViewModelに

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> 

私のアラートは発生せず、エラーが発生します。クロム://firebug/content/net/requestObserver.js Chromeで

キャッチされないでSyntaxErrorクリアスコープ Bronbestandに行くコンパイルとスクリプトを実行するの試み:FFで

:私はalread予期しないトークン&

私はJSの変数に代入しようとする前に、それはのviewmodelのシリアライズにうまくいかない気持ちを持っていますが、私は理由を理解していない...

無効なプロパティ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}]} 

誰かが私を助けることができる:yは

string initialData = Json.Encode(Model); 

が、ノー成功を試してみました...それから私はエラーが

エラー私のjsの中でこれを見ましたか?

+0

私は自分のモデルを埋めるのに間違いを犯したと思います。 invoicelinesは別々の代わりにインボイスオブジェクトの下に直接行かなければならなかった。今は "循環参照がオブジェクトX.Models.Factuurをシリアル化している間に検出されました" – tortuga

+0

うーん、良くない。 1対多リレーションが定義されている場合、片側オブジェクトにはすべての多くのサイドオブジェクトのコレクションが含まれていると同時に、多くのサイドオブジェクトにはそれぞれ関連する片側オブジェクトへのポインタがあるため、EFで自動的に作成されたオブジェクトはシリアル化できません。これは、循環参照父 - >コレクション - >息子オブジェクト - >父を作成します。 循環参照を含むオブジェクトグラフをシリアル化することはできません。シリアル化が機能するためには、オブジェクトグラフはツリーでなければなりません。これは一般的に、ビューに渡されるすべてのオブジェクトのための良い習慣です。 – tortuga

+0

あなたの問題の解決策を見つけたことがありますか? –

答えて

1

変更

var initialDataJS = @(initialData) 

フィル・ハークhttp://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx

レイザーから

var initialDataJS = @Html.Raw(initialData) 

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

0

あなたは引用符文字を置き換える必要があります。ここで私は、この例では

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

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

ので、何をすべきかである、あなたはjsonStr変数に文字列としてサーバからのデータを保存して、正規表現の助けを借りて、二重引用符を交換し、それを解析します。 jsonオブジェクトを作成します。

関連する問題