2016-04-22 30 views
1

我想在我的腳本中使用我的viewmodel從剃刀。 問題是,有時候,由EF生成的具有循環值的我的複雜模型爲null。在JavaScript中使用null c#模型

var skill = @Model.Skill1 != null ? "@Model.Skill1.SkillName" : ""; 

當@ Model.Skill1不爲空時,我可以使用@ Model.Skill1.SkillName。但是,如果@ Model.Skill1爲空,結果是

Object reference not set to an instance of an object. 

而且頁面甚至不呈現。

即使未觸發訪問屬性SkillName的條件,似乎@ Model.Skill1.SkillName無法寫入代碼中。

所以我試圖將我的對象轉換成Json對象,但這次我有循環值生成問題。

任何想法或方法來繞過這個問題?

+0

即使它工作,你也將字符串設置爲* string *'「@ Model.Skill1.SkillName」',而不是'SkillName'的值。你確定'Model'不是null ..? – Rob

+0

是的,我很確定這一點,模型從來不是空的,但有時技能孩子。我知道「@ Model.Skill1.SkillName」,但如果我不這樣做,我有一個錯誤,如: var test = C++;沒有定義 C++是我的價值。 – Fchabert

回答

6

你在混合語言。如果這是你的JavaScript塊:

var skill = @Model.Skill1 != null ? "@Model.Skill1.SkillName" : ""; 

,那麼你必須有服務器端的語句。沒有邏輯確定是否執行它們。所以他們都執行,第二個是NullReferenceException

基本上,你想發出一個空參考客戶等等客戶可以檢查它是否爲空。但到那時你已經試圖解引用它,因此錯誤。

進行空檢查服務器端,只是將結果發送到客戶端代碼。是這樣的:

var skill = '@(Model.Skill1 != null ? Model.Skill1.SkillName : "")'; 

結束語在剃刀@()括號中的值的發光表達式意味着整個語句是服務器端代碼和應導致在單個發射值。

+0

不錯的答案..雖然小修正..如果它是空的..它會變成=> var skill ='「」'...如果你嘗試alert(技能)......它會在屏幕上顯示「」! ,所以我認爲它應該沒有像這樣的周圍單引號var skill = @(Model.Skill1!= null?Model.Skill1.SkillName:「」); –

+0

@AKhudairy:發出字符串值時不會打印行情。引號實際上不是*字符串的一部分,它們只是*表示字符串的語言語法。如果您按照您的建議忽略客戶端引用,則會導致語法錯誤。 – David

+0

在控制檯中試試這個.. var xxx ='「」';警報(XXX); ....告訴我你在屏幕上得到什麼! ...然後試試這個... var xxx ='';警報(XXX); ..你現在得到了什麼? ....也許我的代碼是錯誤的..我沒有試圖看看MVC剃鬚刀引擎是否會正確理解它.. –