簡體   English   中英

無法從@ Url.Action訪問變量

[英]Can not access variable from @Url.Action

我在ASP.Net MVC頁面中有此Javascript

onComplete: function (id, fileName, responseJSON) {
    if (responseJSON.success) {
        $('#divImgs ul').append(
            $('<li>').append(
            $('<a>').attr('href', 
                '@Url.Action("DeleteFile", "Upload", new { id = fileName})').append(
            $('<img>').attr('src', responseJSON.filePath))
         ));
     }
 }

這給出了編譯錯誤

The name 'fileName' does not exist in the current context

為什么我不能在@Url.Action訪問fileName變量?

這個問題是@ Url.Action是在服務器端解析的,而filename是客戶端上的javascript變量。 您最好打賭是這樣的:

onComplete: function (id, fileName, responseJSON) {
    if (responseJSON.success) {
        $('#divImgs ul').append(
            $('<li>').append(
            $('<a>').attr('href', '@Url.Action("DeleteFile", "Upload", new { id = "' + filename + '" })').append(
            $('<img>').attr('src', responseJSON.filePath))
         ));
     }
}

可能有更好的方法將文件名附加到url,但是這里的想法是從服務器渲染基本url,然后根據需要使用javascript對其進行修改。

編輯:我同意haim77。 您需要將路由呈現給服務器端,而不是僅在客戶端附加,以防路由格式改變。 但是在這種情況下,我們需要注入一些JavaScript。 因此,只需將變量注入路由即可將其解析為正確的格式,而且還會輸出JavaScript兼容代碼。

因為filename是一個僅存在於客戶端的JavaScript變量,所以當View呈現自身時, @Url.Action在服務器端執行(之前)。

為了解決這個問題,我通常會做類似的事情:

@object URL_ACTION_PLACEHOLDER = "__MYPLACEHOLDER__";

// ...

onComplete: function (id, fileName, responseJSON) {
    if (responseJSON.success) {
        var myActionUrl = '@Url.Action("DeleteFile", "Upload", new { id = URL_ACTION_PLACEHOLDER })';
        myActionUrl = myActionUrl.replace('@URL_ACTION_PLACEHOLDER', fileName);

        $('#divImgs ul').append(
            $('<li>').append(
            $('<a>').attr('href', myActionUrl).append(
            $('<img>').attr('src', responseJSON.filePath))
         ));
     }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM