Как открыть URL в новой вкладке с помощью Ajax Success? - PullRequest
0 голосов
/ 14 октября 2018

Здесь я пытаюсь открыть файл в новой вкладке, вызывая действие ViewFile контроллера Doctor с помощью Ajax Success, который находится в функции abc(this) при щелчке тега привязки.
Теперь проблема в том, что все так, как требуется, но 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);
    }

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Так как это слишком долго для обычного комментария, я публикую его как ответ, хотя это не решит проблему напрямую, потому что я не могу воспроизвести ее, но может дать некоторое представление и датьвы проверяете разницу с тем, что происходит в вашем коде, по сравнению с этим упрощенным примером.


Вызов window.open() из jQuery ajax success callback работает отлично: https://codepen.io/nomaed/pen/dgezRa

Я использовал тот же шаблон, что и вы, без кода вашего сервера, но с использованием примера API jsonplaceholder.typicode.com.


Есть некоторые проблемы с примером кода, которые вы, возможно, захотите рассмотреть, дажехотя вы не просили комментариев по этому поводу, и это не имеет прямого отношения к вашей проблеме (вероятно):

  1. if (data = true) означает, что данные всегда будут истинными.Вы, вероятно, хотите сделать if (data === true), если вы знаете, что это логическое значение, или if (data), если вы хотите принять любое истинное значение (true, {}, «что-то», 42 и т. Д.).Судя по коду Java и тому, как вы определяете формат ответа в ajax-вызове jQuery, похоже, что вы ожидаете, что результатом переменной «data» будет HTML, а не логическое значение.Возможно, вы захотите попытаться удалить строку dataType: "html" и позволить jQuery установить формат данных в соответствии с тем, что возвращается с сервера, и / или отправить ответ в формате JSON, как в POJO { result: true }, для успешного ответа,Затем убедитесь, что data.result === true, чтобы убедиться, что вы получили то, что ожидали.

  2. Возможно, вам следует добавить произвольные данные в теги DOM-элементов, атрибуты data-* и если вы используете jQuery, получите к ним доступ с помощью селектора .data () .Белое добавление только случайных атрибутов со строковыми значениями может работать, это считается злоупотреблением HTML и DOM, и атрибуты data-* специально предназначены для добавления любых данных.

  3. В abc() функция, в которой вы берете значение атрибута в начале (var getDoCredId = $(thisEvent).attr('docCredId');), но при обратном вызове вы пытаетесь получить значение еще раз.Вам это действительно не нужно, поскольку обратный вызов success () является закрытием в области действия функции abc () и уже имеет доступ к значению, поэтому выполнение var getdoctorId = $(thisEvent).attr('docCredId'); в обратном вызове действительно не требуется.

  4. Я бы также предложил назвать переменную getDoCredId так же, как docCredId.Наличие префикса «get» обычно означает, что это функция получения или ссылка на какой-либо метод получения.Аналогично, аргумент "thisEvent" главной функции, вероятно, должен называться "callerElement" или что-то в этом роде, поскольку это не событие, а фактический элемент, который вы передаете непосредственно из DOM при вызове abc(this)в обработчике события onClick привязки <a>.Это просто для того, чтобы сделать код более понятным для тех, кто его читает, и для себя, когда вы вернетесь к нему через несколько месяцев в будущем и попытаетесь выяснить, что происходит:)

0 голосов
/ 14 октября 2018

Попробуйте добавить 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");
            }
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...