Tengo una aplicación ASP.Net Core. Tengo una clase con algunos atributos:
public class myClass { public string name {get; set;} public int id{get; set;} ... }y en PageModel de Index.cshtml, estoy creando un objeto de esa clase y configurándolo como una propiedad:
public class IndexModel : PageModel { public myObj data { get; set; } public void OnGet(int inputId) { data = new myClass(); data.name = "name"; data.id = inputId; } } Ahora, en mi Index.cshtml, tengo un html predeterminado y luego agrego un script como este: <script type="module" src="~/built/script.js"></script>
Finalmente, mi pregunta: necesito los datos que he definido en IndexModel en mi script.js. En una página cshtml normal, haría @Model.data, pero ese decorador no está disponible en mi archivo js. ¿Hay alguna manera de hacer esto, o debería usar uno de los siguientes que creo que podría funcionar?
Soy bastante nuevo en ASP.Net y JS, por lo que podría haber una respuesta obvia a esto que soy demasiado inexperto para saber. ¡Cualquier ayuda es apreciada!
Hay cuatro formas de hacer esto, encontraste dos de ellas. Te daré los pros y los contras en orden de complejidad:
AJAX:
No es tan difícil, use el método "buscar" integrado en el objeto de la ventana. Pero es asincrónico, por lo que debe lidiar con las devoluciones de llamada en JavaScript, deberá proteger la API para que solo acepte clientes autorizados (generalmente se hace con OAuth, pero podría inyectar un código de autorización para que lo use el JavaScript del cliente), y necesita identificarse (como una sesión) en la API para obtener los datos correctos, por lo que es otro código. Oh, espera, ¿tenemos que inyectar un código? Entonces, ¿cuál es el punto de usar AJAX? Cierto, ¡solo use AJAX cuando necesite obtener nuevos datos dinámicamente sin recargar la página!
Inyección de JavaScript:
Nunca desea inyectar en un archivo .js, deben ser estáticos y es por eso que descubrió que no funcionará. Por lo tanto, debe inyectar código JavaScript creando variables en la página que está cargando JavaScript. Eso es lo que propusiste y es completamente justo hacerlo. No es un truco. Debe ser una variable con una cadena JSON.
Galleta:
Coloque los datos en una cookie temporal entregada con la página y lea la cookie de JavaScript. Esta es más limpia que la solución variable, pero no es la forma más sencilla.
Inyección HTML:
Hay otra posibilidad de usar @Model, en lugar de inyectar la cadena JSON en una variable de JavaScript, lo que también requiere inyectar etiquetas de JavaScript, colocarlo en una propiedad en un elemento HTML y luego acceder a la propiedad desde JavaScript. Este es más simple y mi método preferido. Los nombres de propiedades que comienzan con "data-" están diseñados para esto.
Puede usar el enlace de modelo según lo previsto y convertir el modelo en una variable de javascript en la parte superior de su vista, luego estará disponible en el archivo de secuencia de comandos como una variable de javascript siempre que cargue el archivo de javascript después de crear la variable para contener tu modelo
---TU OPINION---
@model YourModel @using Newtonsoft.Json; <script type="text/javascript"> let mymodel = @Html.Raw(JsonConvert.SerializeObject(Model)); </script> --Importe su archivo de secuencia de comandos después de crear la variable javascript y mymodel debería estar disponible
<script type="text/javascript" src=""></script> mymodel en su archivo de script