【问题标题】:The name 'id' does not exist in the current context in Javascript methodJavascript 方法的当前上下文中不存在名称“id”
【发布时间】:2015-09-30 18:47:32
【问题描述】:

通过尝试如下所示的几种方法,我无法在 lambda 表达式中使用传递给我的 javascript 方法的参数。如何在下面的表达式中使用 id 参数?提前致谢。

FileName中有一个超链接,我将ID参数传递给Javascript方法成功:

<a onclick="downloadFile(@p.ID);">@p.FileName</a>

function downloadFile(id) {
    $.fancybox({
        //This works: (p.ID == 82)
        content: '<img     src="data:image/png;base64,@System.Convert.ToBase64String(Model.FileAttachments.FirstOrDefault(p => p.ID == 82 ).FileData)" alt=""/>',

        //They are not works: (p.ID == id / p.ID == @id  / p.ID == this.id)
        content: '<img src="data:image/png;base64,@System.Convert.ToBase64String(Model.FileAttachments.FirstOrDefault(p => p.ID == id ).FileData)" alt=""/>',

        content: '<img src="data:image/png;base64,@System.Convert.ToBase64String(Model.FileAttachments.FirstOrDefault(p => p.ID == @id ).FileData)" alt=""/>',

        content: '<img src="data:image/png;base64,@System.Convert.ToBase64String(Model.FileAttachments.FirstOrDefault(p => p.ID == this.id ).FileData)" alt=""/>',

        type: "html"
    });
}


更新:这是我之前使用的Ajax方法

function downloadFile(id) {
    $.ajax({
        url: "/Issue/RenderImage",
        type: "POST",
        data: JSON.stringify({ 'id': id }),
        dataType: "json",
        traditional: true,
        contentType: "application/json; charset=utf-8",

        success: function (response) {
            $.fancybox({
                content: '<img height="200" width="250" src="data:image/png;base64,' + response.Image + '" />',
                type: "html"
            //});
        },
        error: function () {
            alert("an error has occured!!!");
        }
    });
}

【问题讨论】:

  • 我在这里猜测,但我假设您的值 id 未设置。您的错误消息是客户端(在浏览器开发控制台中)还是服务器端?上下文是什么 - 您如何调用 downloadFile() 以及您的 c# 代码 ... FirstOrDefault(p =&gt; p.ID == @id ) ... 何时以及如何生成?更多细节和代码(服务器端、生成的 html、html 页面)肯定会更容易提供帮助。
  • @threeFourOneSixOneThree 我更新了我的问题。请确保 id 参数已成功传递给 Javascript 方法(我在 Firebug 中检查过)。有什么想法吗?
  • 你知道js不能直接从后面调用方法,如果要调用,需要ajax,第一个方法可以调用成功,因为你输入的id是82,是一个int数,NET可以理解
  • @SkyFang 其实一开始我用的是Ajax,但是听说“这种操作没必要用AJAX。图片是页面的单独资源,已经作为单独的请求加载了。只需链接到它:”如this 页面所示。另一方面,除了在我的javascript方法中传递id之外没有问题。所以你怎么看?我必须为此使用 Ajax 吗?如果是这样,您能否发布一个适用于图像和 excel/pdf 文件的 AJax 方法,可以通过单击我上面发布的链接打开这些文件?谢谢
  • @threeFourOneSixOneThree 为什么投反对票而不是帮助?

标签: javascript jquery asp.net-mvc lambda url-parameters


【解决方案1】:

如果有人告诉你不需要ajax,看起来图像数据可以发布到页面,就像字典一样,你可以改变你的代码,把你的Model.FileAttachments变成js的一部分,就像

var allPictures= @JsonConvert.SerializeObject(Model.FileAttachments.ToDictionary(k=>k.ID,v=>System.Convert.ToBase64String(v.FileData)));
function downloadFile(id) {
    $.fancybox({
        content: '<img src="data:image/png;base64,'+allPictures[id] +'" alt=""/>',
        type: "html"
    });
}

你说你要下载其他文件类型(pdf等),它不能像图像,如果没有限制下载文件,你可以使用这样的代码

<a href="filePath">fileName</a> 

【讨论】:

  • 感谢您的回复。编译器错误消息:CS0118:“Newtonsoft.Json.JsonConvert”是“类型”,但用作“变量”。另一方面,如果您建议我使用 Ajax 而不是这个,您能否通过更新我上面的 Ajax 方法来发布 Ajax 示例?我想将所有图像、png 和其他文件类型(pdf 等)列为超链接,单击此链接时我想打开图像文件并下载其他文件类型。有什么帮助吗?
  • 投票+,但需要解决选择为答案的问题。
  • 我之前丢了SerializeObject,fancybox无法下载其他文件,fancybox只是一个jquery插件,用于灯箱效果,我已经回答了如何下载其他文件类型
  • 如果你想让用户点击图片下载文件,你只需在容器'image'中添加a,如&lt;a href="filePath"&gt;&lt;image /&gt;&lt;/a&gt;
  • 非常感谢您的帮助。在您的帮助下,我解决了问题并发布了最终代码,以便其他人也可以使用它。投票+
【解决方案2】:

我通过修改@Sky Fang的答案发布了代码的最终工作状态,以便有人需要使用它。我还将title参数传递给javascript方法。

查看:

@using Newtonsoft.Json

<a onclick="showImage(@p.ID, '@p.FileName - @p.Created - @p.AuthorID');">@p.FileName</a>


<script>    
function showImage(id, imageTitle) {
    $.fancybox.showLoading(); //Shows loading animation 
    var allImages=  @(new HtmlString(JsonConvert.SerializeObject(Model.FileAttachments.ToDictionary(k=>k.ID,v=>System.Convert.ToBase64String(v.FileData)))));
    $.fancybox({
        'scrolling'         : 'no',
        'titleShow'         : true,
        'title'             : imageTitle,
        'showCloseButton'   : true,
        'titlePosition'     : 'outside',
        //'titleFormat'     : formatTitle,
        //'transitionIn'    : 'fade',
        //'transitionOut'   : 'fade',
        //'speedIn'         : 600,
        //'speedOut'        : 200,
        'overlayShow'       : false,
        content: '<img style="height:500px; width:auto;" src="data:image/png;base64,'+ allImages[id] +'" />',
        type: "html"
    });
}
</script>

【讨论】:

    猜你喜欢
    • 2013-10-02
    • 2014-04-22
    • 2017-06-17
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多