2015-11-25 26 views
0

我在類型複選框的輸入標籤調用一個JavaScript功能和onchange事件發送模型布爾值到js函數結果從模型傳遞三個參數的函數:在平變化函數參照

<input type="checkbox" ... onchange="changeRow('@Model.Id', '@Model.Type', @Model.AwaitingApproval)" ... 

在changeRow javascript函數中,前兩個值正確報告,但第三個參數(布爾類型)是對onchange函數的引用。在檢查該值時,我可以看到onchange函數簽名,並指出它是一個函數。

這是一個正常的MVC應用程序,帶有一些jquery,數據通過來自控制器的ajax調用進行通信,該控制器通過模型提供數據。

如果我更改代碼以執行以下操作:

<label>@Model.AwaitingApproval <input type="checkbox" ... onchange="changeRow('@Model.Id', '@Model.Type', @Model.AwaitingApproval)" ... </label> 

然後,值TRUE被複選框前打印的頁面上。所以,這證明了模型的價值是正確的,並且可以被引用。

任何想法可能會導致js函數中的怪異行爲將不勝感激! (或者對這種行爲的解釋,如果它是預期,我不理解爲什麼會這樣。)

JavaScript函數:

function changeRow(Id, Type, AwaitingApproval) 
{ 
    if (!AwaitingApproval) (*This is where I first detected the problem*) 
    { 
    ... 
    } 
} 

沒有什麼「特殊」關於JavaScript函數,它只是接收參數,然後根據這些值進行處理。 ID參數具有正確的整數值,類型字段具有正確的字符串值,但AwaitingApproval參數具有下列:

function onchange(event) 
{ 
    changeRow('7334512', 'targeted', onchange) 
} 

這基本上是參照我在分配給onchange事件的函數第一個地方,你猜對了,第三個參數中的onchange就是對同一個函數的另一個引用,以同樣的方式導致無限的參考循環。

+0

顯示你的'changeRow()'函數。 –

+0

@Stephen - 我已經添加了關於javascript代碼和我在那裏的問題的更多信息。感謝您的時間! – WJK

回答

1

有了一些更多的上場,我想在一個代碼塊封閉第三個參數來試一試:

onchange="changeRow('@Model.Id', '@Model.Type', '@{ @Model.AwaitingApproval }')" 

然後導致存儲在屬性正確的布爾值。

我完全不理解這種行爲,如果有人可以對此有所瞭解,我會很樂意。

斯蒂芬·馬克提出了清潔方式

onchange="changeRow('@Model.Id', '@Model.Type', '@Model.AwaitingApproval.ToString()')" 

重要的是要記住的報價,然後測試字符串值(「真」 /「假」)在JavaScript功能。

+0

我懷疑這會工作是'AwaitingApproval'是'false' –

+0

剛剛測試,它不會 - 你需要使用'@ Model.AwaitingApproval.ToString()'。然後測試它的「真」還是「假」。但是你會更好地擺脫(糟糕的)'onchange()'並使用[unobtrusive javascript](https://en.wikipedia.org/wiki/Unobtrusive_JavaScript) - $(yourCheckBox).change(function (){....});' –

+0

這很奇怪,因爲我的答案對True和False都有效。我很抱歉,因爲我有一個拼寫錯誤,代碼塊應該用引號括起來。 我喜歡你的建議,使用不顯眼的js進行事件綁定,但這是我必須做的維護代碼,並沒有不顯眼的js事件綁定完成,所以我想堅持一個「標準」,不幸的是這個標準爲此項目是標籤上的屬性事件綁定。我修正了這個「錯字」,以反映我現在的情況。 – WJK

0

在你的第一個例子<input type="checkbox" ... onchange="changeRow('@Model.Id', '@Model.Type', @Model.AwaitingApproval)" ...你有你的@Model.AwaitingApproval參數沒有''。所以也許試試onchange="changeRow('@Model.Id', '@Model.Type', '@Model.AwaitingApproval')"

+0

目的,爲了解釋我得到了onchange函數引用的參考。如果我使用建議的修復方法,我會將「onchange」作爲字符串值而不是bollean屬性值。 – WJK