1

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

fileName内の変数にアクセスできないのはなぜ@Url.Actionですか?

4

2 に答える 2

3

この問題は、@Url.Action がサーバー側で解決され、ファイル名がクライアント側の 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 互換コードも出力されます。

于 2013-07-01T15:55:23.080 に答える
2

filenameはクライアント側にのみ存在する JavaScript 変数であるため、while はサーバー側でレンダリング@Url.Action時に (事前に) 実行されます。View

問題を解決するために、私は通常次のようなことをします:

@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))
         ));
     }
 }
于 2013-07-01T15:58:42.723 に答える