Amigos, acabo de migrar mi aplicación ASP.Net Core 2 MVC a .Net 6, pero desde entonces tengo un problema extraño: los textos de mis respuestas XMLHttpRequest siempre están vacíos, "{}" o [{},{},{ },{}] para matrices, a pesar de que mi backend realmente devuelve datos.
Aquí hay un ejemplo de un método de control (TestLoad) que devuelve una clase simple (TestClass). Tenga en cuenta que cuando interrumpo la línea de retorno, el valor devuelto está bien, o al menos no veo nada malo (vea la imagen para ver la información de depuración): backend
public class TestClass { public int id = 0; public string title = "Title"; public bool active = false; } public JsonResult TestLoad() { TestClass testClass = new TestClass(); testClass.id = 10; testClass.title = "Yeah man!"; testClass.active = true; JsonResult jsonRes = Json(testClass); return jsonRes; }
Pero una vez en el front-end, obtuve un objeto vacío, no indefinido ni nulo, pero realmente un objeto vacío (ver imagen para información de depuración): frontend
var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) { var dt = JSON.parse(xmlhttp.responseText); if (dt == 'err') { alert('error'); } else if (dt !== null) { alert(dt.title); } } else { alert(xmlhttp.status); } } } ldwait(false, false); xmlhttp.open("GET", rv + "ajxGame/TestLoad", true); xmlhttp.setRequestHeader('Cache-Control', 'no-store'); xmlhttp.setRequestHeader("Content-Type", "application/json"); xmlhttp.send();
Cualquier ayuda sería muy apreciada ya que no tengo ni idea de lo que sucedió. De nuevo, mi código no ha cambiado, pero mi proyecto ha migrado de .Net Core 2 a .Net 6.
Gracias
¿Está utilizando páginas de Razor en su Asp.net core 6?
Si es así, la forma en que llama a su método puede ser el problema. Para solicitudes posteriores, llame desde el cliente ?handler=TestLoad
y en el servidor asegúrese de que el nombre del método sea OnPostTestLoad()
.
Las solicitudes de obtención están deshabilitadas de forma predeterminada y deben habilitarse. Mensaje de advertencia de Microsoft
Para obtener más información, consulte este enlace de documentos de Microsoft
Otro problema puede ser la forma en que devuelves tu clase. Intente devolverlo como un objeto JSON en su lugar.
return new JsonResult(new {objClass: testClass});
Y en el lado del cliente, obtenga su clase como una propiedad de objeto
let objClass = result.objClass;
agregaría un tipo de respuesta y reemplazaría onreadystatechange con onload
xmlhttp.responseType = 'json'; xmlhttp.onload = () => { console.log("load - "+ JSON.stringify(xhr.response)); var data = xhr.response; }
En realidad, mi error fue simplemente que olvidé agregar { get; establecer; } en cada propiedad de mi TestClass en la parte de backend. Funcionó sin él en .Net Core 2, pero parece que ahora es obligatorio en .Net 6
public class TestClass { public int id {get; set;} = 0; public string title {get; set;} = "Title"; public bool active {get; set;} = false; }
... gracias a los que intentaron una respuesta!