Necesito implementar la funcionalidad para cargar archivos y guardarlos relevantes para el orderItemID (que puedo obtener). El problema no es obtener la ID o usar la ID para luego guardar los archivos en la base de datos. El problema es pasar esta ID (que puedo cerrar sesión y ver que está allí) en el controlador para luego ser utilizada, el parámetro continúa volviendo NULL cuando no lo es.

Inicialmente intenté pasar el orderItemID como segundo parámetro al cargar el documento, pero eso provocó que tanto HttpPostedFileBase como el int de orderItemID volvieran como NULL tan pronto como ingresé el método.

Intenté pasar el orderItemID a través de ViewBag. característica pero vuelve a aparecer como NULL

Ahora estoy tratando de hacer una segunda llamada AJAX separada que simplemente pasa un int (orderItemID) y luego en el controlador puedo probar otras cosas, pero por ahora solo me gustaría ver que el parámetro no regrese como NULL cuando presiono el punto de interrupción en el orderController.

View:
        $('#confirmUploadDiagrambtn').on("click", function () {
            var currentID = document.getElementsByName("orderitemid")[0].value;
            var form = $("#file")[0].files[0];
            var datastring = new FormData();
            datastring.append('file', form);

            //Order Item ID is logged out as the expected 12121
            console.log("OrderID: " + currentID);

            //Errors out saying parameter is NULL
            setOrderItemID(currentID);

            uploadDocument(datastring);
        })

        function setOrderItemID(cOrderItemID) {
            $.ajax({
                type: "POST",
                url: '/Order/SetCurrentOrderItemID',
                data: cOrderItemID,
                contentType: false,
                processData: false,
                success: function (response) {
                    console.log('Item Success');
                    console.log(response);
                },
                error: function (status) {
                    console.log('Item Error');
                    console.log(status);
                }
            })
        }

Controller:

        [HttpPost]
        public void SetCurrentOrderItemID(int orderItemID)
        {
            //I can try whatever later, just need the param to not be NULL
            ViewBag.cOrderItemID = orderItemID;
        }

Esperado: orderItemID será igual a 12121

Actual: NULL

Error: el diccionario de parámetros contiene una entrada nula para el parámetro 'orderItemID' de tipo no anulable 'System.Int32' para el método 'Void SetCurrentOrderItemID (Int32)'

1
ScoL4 4 sep. 2019 a las 13:40

3 respuestas

La mejor respuesta

Por defecto, se supone que los parámetros int provienen de la cadena de consulta, puede cambiar la url a:

function setOrderItemID(cOrderItemID) {
        $.ajax({
            type: "POST",
            url: '/Order/SetCurrentOrderItemID?orderItemID=' + cOrderItemID,
            contentType: false,
            processData: false,
            success: function (response) {
                console.log('Item Success');
                console.log(response);
            },
            error: function (status) {
                console.log('Item Error');
                console.log(status);
            }
        })
    }

O bien, puede marcar el parámetro con el atributo [FromBody]:

[HttpPost]
public void SetCurrentOrderItemID([FromBody] int orderItemID)
{
    //I can try whatever later, just need the param to not be NULL
    ViewBag.cOrderItemID = orderItemID;
}

Y luego actualice su parámetro de datos a:

data: JSON.stringify({orderItemId: cOrderItemID}),
0
SBFrancies 4 sep. 2019 a las 11:04

La propiedad "data" en los parámetros de AJAX debería verse así:

data: "cOrderItemID=" + cOrderItemID

Editar:

Eliminar esta línea:

contentType: false,
1
Ayoub Laazazi 4 sep. 2019 a las 11:18

Usa este formato:

data : {OrderItemID : cOrderItemID}
1
ahmad moghimi 4 sep. 2019 a las 11:57