Как правильно передать файлы в контроллер asp.net MVC через запрос jquery ajax - PullRequest
0 голосов
/ 15 июня 2019

Итак, я пытаюсь передать 1 или несколько файлов на мой .net mvc api контроллер.Все работало отлично, пока я не хотел добавить файлы.Как только я добавил возможность пытаться отправлять файлы независимо от того, что я делаю, я получаю сообщение об ошибке

Uncaught TypeError: Недопустимый вызов

Я прочитал многодругие сообщения на форуме, и большинство из них просто говорят добавить contentType: false и processData: false к команде ajax.Когда я делаю это, я получаю ошибку 415 обратно.Я был бы очень признателен, если бы кто-то мог объяснить, что я делаю с этим не так.

Ниже моя модель:

public class AuditStandardDto
{

    [Required]
    [StringLength(255)]
    public string StandardName { get; set; }

    [Required]
    public bool IsInspect { get; set; }

    [Required]
    public bool IsAudit { get; set; }

    [Required]
    public bool IsReport { get; set; }

    [Required]
    public bool IsStandardReady { get; set; }

    [Required]
    public bool IsMaturityScore { get; set; }

    [Required]
    public int StandardStatusId { get; set; }

    public string StandardShortName { get; set; }

    public string StandardDescription { get; set; }

    public string AuthoritativeSource { get; set; }

    public string AuthoritativeURL { get; set; }

    [Required]
    public int StandardTypeId { get; set; }

    public IEnumerable<HttpPostedFileBase> File { get; set; }
}

Вот мой контроллер

 [HttpPost]
    [Route("api/NewStandards/UpdateStandard/{id}")]
    public IHttpActionResult UpdateStandard(int id,AuditStandardDto standardDto)
    {
        try
        {
            var standardInDb = _dbContext.AuditStandards.Single(s => s.Id == id);

            standardInDb.StandardName = standardDto.StandardName;
            standardInDb.IsInspect = standardDto.IsInspect;
            standardInDb.IsAudit = standardDto.IsAudit;
            standardInDb.IsReport = standardDto.IsReport;
            standardInDb.IsMaturityScore = standardDto.IsMaturityScore;
            standardInDb.StandardStatusId = standardDto.StandardStatusId;
            standardInDb.StandardShortName = standardDto.StandardShortName;
            standardInDb.StandardDescription = standardDto.StandardDescription;
            standardInDb.AuthoritativeSource = standardDto.AuthoritativeSource;
            standardInDb.AuthoritativeURL = standardDto.AuthoritativeURL;
            standardInDb.StandardTypeId = standardDto.StandardTypeId;
            standardInDb.IsStandardReady = standardInDb.IsStandardReady;
            standardInDb.Updated = DateTime.Now;

            _dbContext.SaveChanges();

            return Ok();
        }
        catch 
        {
            return BadRequest();
        }
    }

и наконец мой JQuery

$('#newStandard').submit(function(e) {
        e.preventDefault();
        var standardTypeId = $('#ddlStandardType').val();
        var isInspect = $('#cbIsInspect').is(':checked');
        var isAudit = $('#cbIsAudit').is(':checked');
        var isReport = $('#cbIsReport').is(':checked');
        var isMaturityScore = $('#cbRequiresMaturityScore').is(':checked');
        var standardName = $('#txtStandardName').val();
        var standardShortName = $('#txtStandardShortName').val();
        var authoritativeSource = $('#txtAuthoritativeSource').val();
        var authoritativeUrl = $('#txtAuthoritativeURL').val();
        var standardStatusId = $('#ddlStandardStatus').val();
        var standardDescription = $('#txtStandardDescription').val();

        var vm = {
            "standardTypeId": standardTypeId,
            "isInspect": isInspect,
            "isAudit": isAudit,
            "isReport": isReport,
            "isMaturityScore": isMaturityScore,
            "standardName": standardName,
            "standardShortName": standardShortName,
            "authoritativeSource": authoritativeSource,
            "authoritativeURL": authoritativeUrl,
            "standardStatusId": standardStatusId,
            "standardDescription": standardDescription
        };

        $('#newStandard input[type=file]').each(function(index, file) {
            vm.file = file.files[0];
        });

        var url = '';
        if ($('#hfMode').val() === 'save') {
            url = '/api/newStandards/';
        } else {
            url = '/api/newStandards/UpdateStandard/' + $('#hfStandardId').val();
        }

        $.ajax({
            url: url,
            method: 'POST',
            data: vm
        })

1 Ответ

0 голосов
/ 15 июня 2019

Вы должны помнить одну вещь, jQuery - это слабо типизированный скрипт. Это означает, что вы можете отправлять объекты с именем JSON. В вашей подписи метода C # вы должны использовать универсальный тип, который является типом Object или даже JSON. Как только ваш метод C # Rest получит объект JSON, вы можете использовать JSON-анализатор, такой как Newtonsoft, и сконструировать требуемый объект отсюда.

Вы получаете ошибку HTTP 415 из-за несовместимости типов, что, в свою очередь, означает, что вы вызываете неправильный метод.

СОВЕТ: Если вы хотите отправить запрос на основе AJax на ваш сервер, то вы должны использовать JSON в качестве общего знаменателя.

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