Tengo el siguiente modelo que está envuelto en mi modelo de vista
public class FloorPlanSettingsModel
{
public int Id { get; set; }
public int? MainFloorPlanId { get; set; }
public string ImageDirectory { get; set; }
public string ThumbnailDirectory { get; set; }
public string IconsDirectory { get; set; }
}
¿Cómo accedo a una de las propiedades anteriores desde Javascript?
Intenté esto, pero me "indefiní"
var floorplanSettings = "@Model.FloorPlanSettings";
alert(floorplanSettings.IconsDirectory);
c#
javascript
jquery
asp.net-mvc
model
Referencia nula
fuente
fuente
Respuestas:
Puede tomar todo su modelo del lado del servidor y convertirlo en un objeto Javascript haciendo lo siguiente:
En su caso, si solo desea el objeto FloorPlanSettings, simplemente pase el
Encode
método de esa propiedad:fuente
Cómo acceder a los datos del modelo en el bloque de código Javascript / Jquery en el
.cshtml
archivoHay dos tipos de
Model
asignaciones de variables de C # a la variable de JavaScript.int
,string
,DateTime
(ex:Model.Name
)Model
,Model.UserSettingsObj
)Veamos los detalles de estas dos tareas.
Para el resto de la respuesta, consideremos el siguiente
AppUser
modelo como ejemplo.Y los valores que asignamos a este modelo son
Asignación de propiedad
Usemos una sintaxis diferente para la asignación y observemos los resultados.
1) Sin envolver la asignación de propiedades entre comillas.
Como puede ver, hay un par de errores,
Raj
yTrue
se consideran variables de JavaScript y, dado que no existen, es unvariable undefined
error. Donde en cuanto a la variable dateTime el error esunexpected number
números no pueden tener caracteres especiales, las etiquetas HTML se convierten en sus nombres de entidad para que el navegador no mezcle sus valores y el marcado HTML.2) Ajuste de la asignación de propiedades en Cotizaciones.
Los resultados son válidos, por lo que ajustar la asignación de propiedades entre comillas nos da una sintaxis válida. Pero tenga en cuenta que el número
Age
ahora es una cadena, por lo que si no lo desea, podemos eliminar las comillas y se representará como un tipo de número.3) Usar
@Html.Raw
pero sin envolverlo entre comillasLos resultados son similares a nuestro caso de prueba 1. Sin embargo, el uso
@Html.Raw()
en laHTML
cadena nos mostró algún cambio. El HTML se retiene sin cambiar a sus nombres de entidad.De los documentos Html.Raw ()
Pero aún tenemos errores en otras líneas.
4) Usar
@Html.Raw
y también envolverlo entre comillasLos resultados son buenos con todos los tipos. Pero nuestros
HTML
datos ahora están rotos y esto romperá los scripts. El problema es porque estamos usando comillas simples'
para envolver los datos e incluso los datos tienen comillas simples.Podemos superar este problema con 2 enfoques.
1) use comillas dobles
" "
para ajustar la parte HTML. Como los datos internos solo tienen comillas simples. (Asegúrese de que después de ajustar con comillas dobles no haya"
dentro de los datos también)2) Escapar del significado del carácter en el código del lado del servidor. Me gusta
Conclusión de la asignación de propiedad
Html.Raw
para interpretar sus datos HTML tal como están.Asignación de objeto
Usemos una sintaxis diferente para la asignación y observemos los resultados.
1) Sin envolver la asignación de objetos entre comillas.
Cuando asigna un objeto ac # a la variable javascript, se asignará el valor
.ToString()
de ese objeto. De ahí el resultado anterior.2 Asignación de objeto de ajuste entre comillas
3) Uso
Html.Raw
sin comillas.4) Usar
Html.Raw
junto con citasNo
Html.Raw
fue de mucha utilidad para nosotros al asignar un objeto a la variable.5) Usar
Json.Encode()
sin comillasVemos algún cambio, vemos que nuestro modelo se está interpretando como un objeto. Pero hemos cambiado esos caracteres especiales
entity names
. Tampoco es útil utilizar la sintaxis anterior entre comillas. Simplemente obtenemos el mismo resultado entre comillas.De los documentos de Json.Encode ()
Como ya ha encontrado este
entity Name
problema con la asignación de propiedades y si recuerda, lo superamos con el uso deHtml.Raw
. Así que probemos eso. Vamos a combinarHtml.Raw
yJson.Encode
6) Uso
Html.Raw
yJson.Encode
sin comillas.El resultado es un objeto Javascript válido
7) Uso
Html.Raw
yJson.Encode
entre comillas.Como ve, envolver con comillas nos da datos JSON
Conslusión en la asignación de objetos
Html.Raw
yJson.Encode
en combinación para asignar su objeto a la variable javascript como objeto JavaScript .Html.Raw
yJson.Encode
envuélvaloquotes
para obtener un JSONNota: Si ha observado que el formato de datos DataTime no es correcto. Esto se debe a que, como se dijo anteriormente,
Converts a data object to a string that is in the JavaScript Object Notation (JSON) format
JSON no contiene undate
tipo. Otras opciones para solucionar este problema es añadir otra línea de código para manejar este tipo solo usando javascipt Fecha) ( objetoCómo acceder a los datos del modelo en el bloque de código Javascript / Jquery en el
.js
archivoLa sintaxis de la maquinilla de afeitar no tiene significado en el
.js
archivo y, por lo tanto, no podemos usar directamente nuestro Modelo en un.js
archivo. Sin embargo, hay una solución.1) La solución está utilizando variables globales de JavaScript .
Tenemos que asignar el valor a una variable global javascipt restringidos y luego utilizar esta variable dentro de todos bloque de código de sus
.cshtml
y.js
archivos. Entonces la sintaxis seríaCon esto en su lugar, podemos usar las variables
userObj
yuserJsonObj
como y cuando sea necesario.Nota: Yo personalmente no sugiero usar variables globales, ya que es muy difícil de mantener. Sin embargo, si no tiene otra opción, puede usarla con una convención de nomenclatura adecuada ... algo así
userAppDetails_global
.2) Usando la función () o
closure
Envuelva todo el código que depende de los datos del modelo en una función. Y luego ejecute esta función desde el.cshtml
archivo.external.js
.cshtml
expedienteNota: Su archivo externo debe ser referenciado antes de la secuencia de comandos anterior. De lo contrario, la
userDataDependent
función no está definida.También tenga en cuenta que la función también debe tener un alcance global. Entonces, cualquiera de las soluciones tenemos que lidiar con jugadores de alcance global.
fuente
var model = @Html.Raw(Json.Encode(Model));
esto creará un objeto javascriptmodel
que no tiene conexión con el Modelo C # que pasas a la vista. De hecho, no habrá una vez que se haya presentadoModel
la vista. Por lo tanto, el formulario en la interfaz de usuario no tendrá idea de los cambios en los datos del objeto javascript. Ahora debe pasar todo este modelo modificado al controlador a través de AJAX, o debe actualizar el valor de sus controles de entrada en el formulario usando javascript.Although I did the same thing using hidden Html control and bound it to EventCommand and updated it's value in javascript. But wondering if could do same directly to model?
para esta declaración ... no hayEventCommand
en MVC, es para Webforms donde hay una conexión entre la UI y las acciones del servidor, en MVC todo está separado. La única forma de interactuar con el controlador es a través de AJAX o Enviar formulario o Solicitud de nueva página (recargar también)prueba esto: (te perdiste las comillas simples)
fuente
JSON
comillas le da unjavascript Object
. Mira mi respuesta en el mismo hilo para más detalles. stackoverflow.com/a/41312348/2592042Envolver la propiedad del modelo alrededor de los padres funcionó para mí. Todavía tiene el mismo problema con Visual Studio quejándose del punto y coma, pero funciona.
fuente
Si se genera el error "ReferenceError: el modelo no está definido" , puede intentar utilizar el siguiente método:
Espero que esto ayude...
fuente
Sé que es demasiado tarde, pero esta solución funciona perfectamente para .NET Framework y .net core:
@ System.Web.HttpUtility.JavaScriptStringEncode ()
fuente