2015-11-04 120 views
0

我正在嘗試解決我的WEB API中的CSRF問題。我正在嘗試實施顯示爲here的解決方案。是否可以從外部JavaScript文件調用Razor @function?

從我所知道的,我需要在我的Razor代碼中創建一個@function {...}塊,我已經完成了。 (基本上從文章同樣的功能)

@functions{ 
    public string TokenHeaderValue() 
    { 
     string cookieToken, formToken; 
     AntiForgery.GetTokens(null, out cookieToken, out formToken); 
     return cookieToken + ":" + formToken; 
    } 
} 

然後我有嘗試通過以下調用此方法外部.js文件:

$.ajax({ 
    url: url, 
    type: "POST", 
    async: false, 
    data: JSON.stringify(data), 
    contentType: 'application/json; charset=utf-8', 
    headers: { 
     'RequestVerificationToken': '@TokenHeaderValue()' 
     }, 
    error: function (response) { 
     alert(response.responseText); 
    }, 
    success: function (response) { 
     result = response; 
    } 
}); 

我「TokenHeaderValue()」方法從來不會稱爲,此外,我可以在Fiddler中看到「RequestVerificationToken:@TokenHeaderValue()」的字符串是傳遞的內容,而不是「TokenHeaderValue()」的返回結果。

這是怎麼回事?爲什麼不會實際調用「TokenHeaderValue()」?

+0

如果你的JS是不是在你的Razor視圖將無法正常工作,@令牌沒什麼意思在JavaScript中。你可以在你的視圖中有一個內聯腳本,你可以調用它來返回值。 – Lee

回答

0

如果您使用全局變量並在JavaScript中引用它,它應該可以工作。

在您的Razor視圖:

<script>window._csrfToken = '@TokenHeaderValue()';</script> 

在您的JS文件:

$.ajax({ 
    //... 
    headers: { 
     'RequestVerificationToken': window._csrfToken 
    }, 
    //... 
}); 
相關問題