我在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
变量?
答案 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.Action
在View
呈现自身时在服务器端执行({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))
));
}
}