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 回答