Свойства комплексного типа имеют значение null или значение по умолчанию в аргументе действия контроллера при вызове AJAX POST - PullRequest
1 голос
/ 08 февраля 2020

Я просмотрел несколько постов здесь со схожими проблемами и попробовал несколько альтернатив, предложенных здесь, но безуспешно.

Я пытаюсь сделать AJAX вызов POST от javascript к моему действию контроллера, разработанному в. NET CORE 2.1. Действие получает сложный объект в качестве аргумента.

Подробности указаны ниже.

AJAX ВЫЗОВ:

var scanRequest = {
        GUID: guid,
        UserEmail: email,
        ApplicationURL: appURL,
        ApplicationName: appName,
        SelectedAppTimezone: appTimeZone,
        ScheduledScanTime: schScnTime,
        SelectedLocation: location,
        SelectedPrimaryContactTimezone: appPriTimeZone,
        AdditionalContacts: addContacts,
        APMID: apmID,
        OwningTerritory: ownTerritory,
        SelectedLineOfService: los,
        ScanAuthenticationRequired: scnAuthReq,
        ScanAuthenticationDetails: scanAuthDetails
    };


    var source = JSON.stringify(scanRequest);

    var actionURL = "/ScanRequest/NewScanRequest";

    $.ajax({
        url: actionURL,
        contentType: 'application/json; charset=utf-8',
        type: 'POST',
        data: { 'request': source },
        success: function (response) {
            $('#modalContent').modal('show');
            $("#modalbodyContent").html(response);
        },
        error: function (response) {
            alert(response);
        }
    });

Действие контроллера

[HttpPost]
    public ActionResult NewScanRequest( ScanRequest request)
    {
        .....
     }

Сложный класс

public class ScanRequest
{
    public string GUID { get; set; }
    public string UserEmail { get; set; }
    public string ApplicationURL { get; set; }
    public string ApplicationName { get; set; }
    public string SelectedAppTimezone { get; set; }

    [NotMapped]
    public IEnumerable<SelectListItem> AppTimezones { get; set; }
    public DateTime ScheduledScanTime { get; set; }
    public string SelectedLocation { get; set; }

    [NotMapped]
    public IEnumerable<SelectListItem> Locations { get; set; }
    public string SelectedPrimaryContactTimezone { get; set; }
    public string AdditionalContacts { get; set; }
    public string APMID { get; set; }   
    public string OwningTerritory { get; set; }

    [NotMapped]
    public IEnumerable<SelectListItem> LineOfServices { get; set; }
    public string SelectedLineOfService { get; set; }
    public bool ScanAuthenticationRequired { get; set; }
    public string ScanAuthenticationDetails { get; set; }
}

После отладки JS я выяснил, что объект становится строковым, даже параметр data запрос AJAX также содержит необходимые данные. Когда запрос достигает действия контроллера, объект появляется, но его внутренние свойства либо равны нулю, либо имеют значения по умолчанию и не содержат значений, отправленных через форму. Я попытался использовать атрибут [FromBody] , но тогда сам объект становится нулевым, когда он достигает действия контроллера. Я приложил скриншоты заголовков запросов, а также полезных данных запроса.

Изображение: параметр в действии (без [FromBody]) ; Изображение: параметр в действии (с [FromBody]) ; Изображение: заголовок запроса ; Изображение: Запрос полезной нагрузки Если кто-то может помочь мне в этом, это будет высоко оценено.

Заранее спасибо.

1 Ответ

1 голос
/ 10 февраля 2020

Я предполагаю, что ваш контроллер не указан с атрибутом [ApiController], и вы хотите передать параметр / данные из тела HTTP-запроса, для достижения этого вы можете обратиться к следующему рабочему примеру, чтобы изменить свой код.

контроллер и действие

public class ScanRequestController : Controller
{
    [HttpPost]
    public ActionResult NewScanRequest([FromBody]ScanRequest request) //Apply the [FromBody] attribute to the parameter
    {
        // code logic here
    }

    //code of other controller actions 
}

Javascript на стороне клиента с данными тестирования

var scanRequest = {
    GUID: "7c3151ca-426a-4ddb-8a48-26a8b9b06b24",
    UserEmail: "test@example.com",
    ApplicationURL: "http://test.com",
    ApplicationName: "app1",
    SelectedAppTimezone: "Pacific Standard Time",
    ScheduledScanTime: "2020-02-10T11:03:15.4502335+08:00",
    SelectedLocation: "location1",
    SelectedPrimaryContactTimezone: "Pacific Standard Time",
    AdditionalContacts: "",
    APMID: "",
    OwningTerritory: "",
    SelectedLineOfService: "l11",
    ScanAuthenticationRequired: true,
    ScanAuthenticationDetails: "details"
};

var source = JSON.stringify(scanRequest);

var actionURL = "/ScanRequest/NewScanRequest";

$.ajax({
    url: actionURL,
    contentType: 'application/json; charset=utf-8',
    type: 'POST',
    data: source,
    success: function (response) {
        alert("success");
        //$('#modalContent').modal('show');
        //$("#modalbodyContent").html(response);
    },
    error: function (response) {
        alert(response);
    }
});

Результат теста

enter image description here

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