无法从@ Url.Action访问变量

时间:2013-07-01 15:50:59

标签: javascript jquery asp.net-mvc-4

我在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变量?

2 个答案:

答案 0 :(得分:3)

这个问题是@ 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))
         ));
     }
}

可能有更好的方法将文件名附加到网址,但这里的想法是从服务器中渲染出基本网址,然后根据需要使用javascript修改它。

编辑:我同意haim77。在路由格式发生变化的情况下,您需要将路由呈现为服务器端,而不是仅仅添加到客户端。但在这种情况下,我们需要注入一些javascript。因此,只需将变量注入路径,即可解析为正确的格式,但也会输出兼容javascript的代码。

答案 1 :(得分:2)

因为filename是仅存在于客户端的JavaScript变量,而@Url.ActionView呈现自身时在服务器端执行({1}}。

要解决这个问题,我通常会这样做:

@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))
         ));
     }
 }