Сообщение Ajax для обновления модели и перезагрузки страницы при сбое, контроллер получает пустую модель - PullRequest
0 голосов
/ 31 октября 2019

Я работаю над основным приложением 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 или сервером».

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