Как правильно использовать URL в вызове Ajax в проекте MVC C # с использованием отдельного файла Javascript - PullRequest
0 голосов
/ 31 октября 2019

В моем проекте у меня есть кнопка, которая сохраняет измененное содержимое HTML-страницы.

Кнопка выглядит следующим образом:

<button class="btn btn-light" title="Export (Ctrl + E)" id="save-btn" data-hmi-action="saveAjax"  data-hmi-shortcut="ctrl+e">
     <i class="la la-save"></i>
</button>

SaveAjax во внешнем файле находится впара частей.

saveAjax: function(fileName, startTemplateUrl, callback)
{
    var data = {};
    data["fileName"] = (fileName && fileName != "") ? fileName : HMI.FileManager.getCurrentUrl();
    data["startTemplateUrl"] = startTemplateUrl;
    if (!startTemplateUrl || startTemplateUrl == null)
    {
        data["html"] = this.getHtml();
    }
    console.log(data);
    $.ajax({
        type: "POST",
        url: 'Home/Save', //set your server side save script url
        data: data,
        cache: false,
        success: function (data) {

            if (callback) callback(data);

        },
        error: function (data) {
            alert(data.responseText);
        }
    });                 
}

URL, указанный выше, является моим действием контроллера. При выполнении выдает ошибку 500 по URL в консоли. У меня установлен разрыв в контроллере, и, как и следовало ожидать, он обходит это.

Вторая часть ниже:

saveAjax : function () {

    var url = Hmi.FileManager.getCurrentUrl();

    return Hmi.Builder.saveAjax(url, null, function (data) {
        $('#message-modal').modal().find(".modal-body").html("File saved at: " + data);
    });     
}

Я попытался использовать URL-адрес на странице бритвы вКнопка, но так как это уже делает вызов на страницу для saveAjax, и это не вызов на основе Id, это не будет работать. URL-адрес в консоли является правильным URL-адресом, то есть он находится в правильном месте. Я думаю, что она ищет страницу под названием Сохранить, а не идет к ActionResult. В этом случае мне не нужен вид для этого.

Я проверяю, прав ли я, ища страницу, а не ActionResult, и если да, есть ли способ, которым я могу заставить это взглянуть на ActionResult вместо страницы.

Возможно, это способ передать что-то в файл javascript, который получает URL, а затем использовать это в сценарии saveAjax.

Добавьте к этому ниже действие data-hmi, которое используется на всех кнопках проекта.

init: function() {
    $("[data-hmi-action]").each(function () {
        on = "click";
        if (this.dataset.hmiOn) on = this.dataset.hmiOn;

        $(this).on(on, HMI.Gui[this.dataset.hmiAction]);
        if (this.dataset.hmiShortcut)
        {
            $(document).bind('keydown', this.dataset.hmiShortcut, HMI.Gui[this.dataset.hmiAction]);
            $(window.FrameDocument, window.FrameWindow).bind('keydown', this.dataset.hmiShortcut, HMI.Gui[this.dataset.hmiAction]);
        }
    });
}

Спасибо за вашу помощь!

Редактировать---

В этом конкретном случае у меня возникла ошибка сервера 500, потому что я пытался перехватить HTML / Javascript, который находится на странице. Dot Net сканирует эту информацию на предмет вымышленных персонажей. Разметка кода выглядит так, как будто кто-то передал информацию вместе с тем, что вы пытаетесь отправить как угрозу.

Может быть отключено. В моем случае это было добавление

[ValidateInput(false)] 

к действию контроллера. Вы также можете охватить все приложение, используя файл web.config.

<system.web>
  <httpRuntime requestValidationMode="2.0" />
</system.web>   

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

MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...