В моем проекте у меня есть кнопка, которая сохраняет измененное содержимое 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