una - validar variables indefinidas javascript
¿Cómo pasar un valor a la maquinilla de afeitar de la variable javascript? (6)
¿Cómo pasar un valor a la variable razor de la variable javascript, es posible el motor asp.net mvc razor view?
@{
int a = 0;
}
<script>
var b = ...
@a = b;
</script>
Bien, entonces esta pregunta es antigua ... pero quería hacer algo similar y encontré una solución que funciona para mí. Tal vez podría ayudar a alguien más.
Tengo un List<QuestionType>
que relleno un menú desplegable. Quiero poner esa selección en la propiedad QuestionType
en el objeto Question
que estoy creando en el formulario. Estoy usando Knockout.js
para el enlace de selección. Esto establece la propiedad observable knockout self.QuestionType
en un objeto QuestionType
cuando el usuario selecciona uno.
<select class="form-control form-control-sm"
data-bind="options: QuestionTypes, optionsText: ''QuestionTypeText'', value: QuestionType, optionsCaption: ''Choose...''">
</select>
Tengo un campo oculto que mantendrá este objeto:
@Html.Hidden("NewQuestion.QuestionTypeJson", Model.NewQuestion.QuestionTypeJson)
En la suscripción para el observable, establezco el campo oculto en una versión JSON.stringify
-ed del objeto.
self.QuestionType.subscribe(function(newValue) {
if (newValue !== null && newValue !== undefined) {
document.getElementById(''NewQuestion_QuestionTypeJson'').value = JSON.stringify(newValue);
}
});
En el objeto Question
, tengo un campo llamado QuestionTypeJson
que se llena cuando el usuario selecciona un tipo de pregunta. Utilizo este campo para obtener el QuestionType
en el objeto Question
esta forma:
public string QuestionTypeJson { get; set; }
private QuestionType _questionType = new QuestionType();
public QuestionType QuestionType
{
get => string.IsNullOrEmpty(QuestionTypeJson) ? _questionType : JsonConvert.DeserializeObject<QuestionType>(QuestionTypeJson);
set => _questionType = value;
}
Entonces, si el campo QuestionTypeJson
contiene algo, lo deserializará y lo usará para QuestionType
, de lo contrario solo usará lo que está en el campo de respaldo.
Básicamente, he "pasado" un objeto JavaScript a mi modelo sin usar Razor
o una llamada Ajax
. Probablemente puedas hacer algo similar a esto sin usar Knockout.js
, pero eso es lo que estoy usando, así que ...
La variable del lado del servidor de Razor View se puede leer en el lado del cliente con JavaScript usando @ While y la variable del lado del cliente de JavaScript se puede leer en la vista de Razor usando @:
Paso: 1 Su Html, primero Almacene el valor en su almacenamiento local usando javascript, luego agregue la línea como abajo, aquí es donde va a mostrar el valor en su html, mi ejemplo se basa en boostrap:
<label for="stringName" class="cols-sm-2 control-
label">@Html.Hidden("stringName", "")</label>
Paso: 2 Javascript
$(''#stringName'').replaceWith(localStorage.getItem("itemName"));
Pero sería posible si se utilizara uno en lugar de la variable en el campo @ html.Hidden. Como en este ejemplo.
@Html.Hidden("myVar", 0);
configurar el campo por script:
<script>
function setMyValue(value) {
$(''#myVar'').val(value);
}
</script>
Espero que al menos pueda ofrecer ninguna solución alternativa pequeña.
Usted no puede y la razón es que no "viven" al mismo tiempo. Las variables Razor son "variables del lado del servidor" y ya no existen después de que la página se envió al "lado del cliente".
Cuando el servidor recibe una solicitud de vista, la crea solo con código HTML, CSS y Javascript. No queda ningún código C #, todo se "traduce" a los idiomas del lado del cliente.
El código de Javascript SÍ existe cuando la vista aún está en el servidor, pero no tiene sentido y será ejecutada solo por el navegador (otra vez del lado del cliente).
Esta es la razón por la que puede usar las variables Razor para cambiar el HTML y el Javascript, pero no al revés. Intente ver el código fuente de su página (CTRL + U en la mayoría de los navegadores), no habrá ningún signo de código C # allí.
En breve:
El servidor recibe una solicitud.
El servidor crea "toma" la vista, calcula y traduce todo el código C # que se incrustó en la vista, a CSS, Javascript y HTML.
- El servidor devuelve la versión del lado del cliente de la vista al navegador como respuesta a la solicitud.
- El navegador renderiza la página y ejecuta todos los Javascripts.
Veo que este problema se discutió hace algún tiempo, pero si alguien se encuentra con esto nuevamente, aquí está mi solución:
En su archivo de vista * .cshtml:
<script>
var data = JsFunction("@Html.Raw(Model.Path)");
$(function () {
$("#btn").click(function () {
var model = { Id: ''@Html.Raw(Model.Id)'', Data: data }
$.ajax({
type: "POST",
url: "/Controller/Action",
data: model,
datatype: "html",
success: function() {
console.log(''Success'');
}
});
});
});
</script>
El modelo de variable de JavaScript es algo que necesito pasar a Razor ViewModel. Se puede hacer con solicitud ajax. Solo necesita tener los argumentos adecuados en su acción, que coincidan con el objeto Json creado en JavaScript.
Espero que ayude a alguien!