Я работаю над основным приложением asp.net. Существует страница настроек, которая изначально пуста. Затем пользователь может обновить настройки, выбрав файл json. Эти настройки затем подтверждаются и отправляются на контроллер. Контроллер должен вернуть ту же страницу, но с отображением обновленных настроек.
Файл читается и отправляется на контроллер, затем он корректно десериализуется в объект настроек и сохраняется в сеансе.
Я пытался использовать GET для обновления настроек, но строка запроса слишком длинная.
Это форма, которую отправляет пользователь, это часть диалога, которая используется несколькими различными функциями, поэтому она очень общая. .
<form method="post">
<button type="submit" class="btn btn-primary" id="modalSubmitButton">Okay</button>
</form>
После того, как пользователь выберет файл, его содержимое будет извлечено, и для вышеуказанной кнопки будет установлен обработчик события.
function OpenFile(event) {
const input = event.target
if ('files' in input && input.files.length > 0) {
var file = (event.target.files)[0];
var fileReader = new FileReader();
fileReader.onload = (function (file) {
return function (e) {
var contents = e.target.result;
document.getElementById("modalHeading").innerHTML = "Please confirm overwrite";
document.getElementById("modalSubmitButton").addEventListener("click", function (e) {
LoadSettings(contents);
});
$("#dialog").modal('show');
};
})(file);
fileReader.readAsText(file);
}
}
Добавление этого к событию click приводит кконтроллер вызывается только один раз (но с нулевым значением для модели)
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
return false;
Вызов ajax для вызова контроллера при нажатии кнопки.
function LoadSettings(settings) {
data = JSON.stringify(settings);
$.ajax({
type: "POST",
data: data,
url: "https://localhost:44365/Site/LoadSettings",
contentType: "application/json; charset=utf-8"
})
}
Эта функция вызываетсяВ зависимости от json существуют две разные страницы настроек.
[HttpPost]
public void LoadSettings([FromBody]SiteSettings config)
{
HttpContext.Session.SetObject("config", config);
if (config.Config.Count < 2)
{
return Settings();
}
return MultiSettings();
}
Что вызывает это (функция контроллера, отвечающая заis page).
[HttpGet]
public IActionResult Settings()
{
var config = HttpContext.Session.GetObject<SiteSettings>("config");
Model = new SettingsViewModel();
if (config != null)
{
Model.Config = config;
}
return View(Model);
}
Этот конструктор принимает настройки json и десериализует их.
public SiteSettings Config { get; set; }
public SettingsViewModel(string settingsConfig)
{
try
{
Config = JsonConvert.DeserializeObject<SiteSettings>(settingsConfig);
}
catch (Exception ex)
{
Config = new SiteSettings();
}
}
Я получаю ошибку 415 при вызове этого с помощью Ajax. Я могу сделать POST и отправить настройки через Почтальон и получить страницу с обновленными настройками. Глядя на это в Fiddler, функция вызывается дважды, первый с json, а второй без.
В Fiddler первый запрос имеет значок «Сеанс был прерван клиентом, Fiddler или сервером».