Почему я получаю неверный запрос с этим сообщением jQuery?

#javascript #jquery #asp.net-mvc

#javascript #jquery #asp.net-mvc

Вопрос:

У меня есть этот JavaScript, который выполняется при нажатии кнопки фиксации для формы. Предполагается, что он отправляет тело формы и файл:

 $("#submitButton").off("click").on("click", function(evt) {
    evt.preventDefault();
    var url = "/portal/ProjectAuthority/Boq"   "?projectId="   "0831260e-7018-dd49-9a84-daaf442bc1ec";

    debugger;
    var data = new FormData();

    //Form data
    var formData = $('#BoqReviewForm').serializeArray();
    $.each(formData, function (key, input) {
        data.append(input.name, input.value);
    });

    //File data
    var fileData = $('input[name="boqFile"]')[0].files;
    for (var i = 0; i < fileData.length; i  ) {
        data.append("boqFile", fileData[i]);
    }

    $("#boqDataWrapper").empty();
    $.post({
        url: url,
        data: data,
        processData: false,
        contentType: false,
        success: function (resp) {
            setTimeout(function() {
                getBoqReviewData(resp.importId);
            },
            100);
        },
        error: function(xmlHttpRequest, textStatus, errorThrown) {
            alert(errorThrown);
        }
    });
    return false;
});
  

Это url :

 http://localhost/portal/ProjectAuthority/Boq?projectId=0831260e-7018-dd49-9a84-daaf442bc1ec
  

и сигнатура метода действия:

 public ActionResult Boq(Guid projectId, BoqUploadViewModel model, HttpPostedFileBase boqFile)
  

Когда я нажимаю кнопку отправки, Ajax error -функция jQuery вызывается до моей точки останова в начале метода действия, поэтому сам метод действия не возвращается Bad Request , независимо от того, что пытается вызвать метод действия.

Есть ли какая-либо очевидная причина Bad Request ошибки?

Комментарии:

1. input[name="boqFile"] Внутри #BoqReviewForm ? Просто догадываюсь, но будет ли он пытаться сериализовать в form.serializeArray() ? Попробуйте переместить его за пределы формы (в качестве теста)

2. Извините, если я ошибаюсь. Но я думаю, вам не нужен параметр model and boqFile c# action при отправке данных как formdata . вы можете получить данные позже, как показано ниже, и Deserialize в модель, если это необходимо. var boqFile= System.Web.HttpContext.Current.Request.Files["boqFile"]; этот для файла и ниже для данных модели var YourModel= System.Web.HttpContext.Current.Request.Params["YourModel"]; var model= JsonConvert.DeserializeObject<YourClass>(YourModel);

3. @freedomn-m пробовал это, спасибо, но я все равно получаю неверный запрос.

4. @NagibMahfuz Спасибо, но как только я снова заработал, он отлично работает с параметрами моего метода действий такими, какие они есть.

Ответ №1:

Оказывается, свойство viewmodel for boqFile имеет самодельный атрибут аннотации данных, который должен проверять расширения файлов, например, только xlsx to , и этот атрибут постоянно терпел неудачу, вызывая неверный запрос, потому что вызов ajax не возвращал модель с ошибками.

Я нашел это, пропустив вызов ajax и выполнив прямую обратную передачу, а затем я получил ошибку о расширении файла, которая была правильной. Я удалил ошибочный атрибут, и обратная передача вернула действительный json, предназначенный для вызова ajax. Затем я просто вернулся к вызову ajax, и все работает.