在这里,我试图通过单击锚标签上的功能abc(this)
中的Ajax Success调用Doctor控制器的ViewFile操作来在新选项卡中打开文件。
现在的问题是,一切都按要求完成,但URL不会在新标签页中打开。
下面是我的Ajax
<script>
function abc(thisEvent) {
debugger;
var getDoCredId = $(thisEvent).attr('docCredId');
var parameter = { id: getDoCredId };
$.ajax({
url: "/Doctor/ViewFile1",
type: "get",
dataType: "html",
data: parameter,
success: function (data) {
debugger;
if (data = true) {
debugger;
var getdoctorId = $(thisEvent).attr('docCredId');
var url = "/Doctor/ViewFile/" + getdoctorId;
window.open(url, "_blank");
}
else {
debugger;
showNotification("Error", "warning");
}
}
});
}
以下是我的锚标记HTML
<a title="View Attachment" docCredId = "' + getDocCredId + '" onclick="abc(this)"><i class="btn btn-web-tbl btn-warning fa fa-eye "></i></a>
下面是代码
public bool ViewFile1(int id)
{
var document = _doctorService.GetDoctorCredentialDetails(id);
string AttachPath = ConfigPath.DoctorCredentialsAttachmentPath;
string strFileFullPath = Path.Combine(AttachPath, document.AttachedFile);
string contentType = MimeTypes.GetMimeType(strFileFullPath);
bool checkFileInFolder = System.IO.File.Exists(strFileFullPath);
if (checkFileInFolder == true)
{
return true;
}
else
{
return false;
}
}
public ActionResult ViewFile(int id)
{
var document = _doctorService.GetDoctorCredentialDetails(id);
string AttachPath = ConfigPath.DoctorCredentialsAttachmentPath;
string strFileFullPath = Path.Combine(AttachPath, document.AttachedFile);
string contentType = MimeTypes.GetMimeType(strFileFullPath);
bool checkFileInFolder = System.IO.File.Exists(strFileFullPath);
bool filedata = System.IO.File.ReadAllBytes(strFileFullPath).Any();
byte[] filedata1 = System.IO.File.ReadAllBytes(strFileFullPath);
var cd = new System.Net.Mime.ContentDisposition
{
FileName = document.FileName,
Inline = true
};
Request.HttpContext.Response.Headers.Add("Content-Disposition", cd.ToString());
return File(filedata1, contentType);
}
答案 0 :(得分:0)
由于这对于常规评论来说太长了,因此我将其发布为答案,尽管它不能直接解决问题,因为我无法重现该问题,但可能会提供一些见解并让与简化的示例相比,您可以检查代码中发生的差异。
从jQuery ajax成功回调中调用window.open()
很好:https://codepen.io/nomaed/pen/dgezRa
我使用了与您相同的模式,但没有服务器代码,而是使用jsonplaceholder.typicode.com示例API。
即使您没有要求提供有关代码示例的注释,并且它与您的问题没有直接关系(可能),您仍可能要考虑该代码示例的某些问题:
if (data = true)
表示数据将始终为真。如果您知道if (data === true)
是布尔值,则可能要执行一次;如果要接受任何真实值(true,{},“ something”,42等),则可能要执行if (data)
。从Java代码以及如何在jQuery ajax调用中定义响应格式来看,您似乎期望“数据”变量的结果是HTML,而不是布尔值。您可能想要尝试删除dataType: "html"
行,并让jQuery根据服务器返回的内容来设置数据格式,和/或发送JSON格式的响应,例如在{ result: true }
的POJO中获得成功的回应。然后确保data.result === true
确保您得到了期望的结果。
您可能应该向data-*
attributes标签DOM元素添加任意数据,如果使用的是jQuery,请使用.data()选择器访问它们。白色仅添加带有字符串值的随机属性可能有效,这被认为是HTML和DOM的滥用,并且data-*
属性专门用于添加任何数据。
在abc()
函数中,您在开头(var getDoCredId = $(thisEvent).attr('docCredId');
)处获取属性的值,但在回调中,您尝试再次获取该值。您真的不需要它,因为success()回调是abc()函数范围内的闭包,并且已经可以访问该值,因此实际上不需要在回调中进行var getdoctorId = $(thisEvent).attr('docCredId');
。 / p>
我还建议将getDoCredId
变量命名为docCredId
。具有“ get”前缀通常意味着它是一个getter函数或对某些getter的引用。同样,主函数的“ thisEvent
”自变量可能应该称为“ callerElement
”或类似的名称,因为它不是事件,它是一个实际元素,当您在在abc(this)
锚点的onClick事件处理程序中调用<a>
。这只是为了使代码更清晰易懂,以供正在阅读它的任何人以及您自己在未来几个月重新使用它并试图弄清楚正在发生什么的时候自己理解:)
答案 1 :(得分:-1)
尝试将async: false
添加到您的Ajax请求中
function abc(thisEvent) {
debugger;
var getDoCredId = $(thisEvent).attr('docCredId');
var parameter = { id: getDoCredId };
$.ajax({
async: false, // <<<----------- add this
url: "/Doctor/ViewFile1",
type: "get",
dataType: "html",
data: parameter,
success: function (data) {
debugger;
if (data = true) {
debugger;
var getdoctorId = $(thisEvent).attr('docCredId');
var url = "/Doctor/ViewFile/" + getdoctorId;
window.open(url, "_blank");
}
else {
debugger;
showNotification("Error", "warning");
}
}
});
}