Comment passer une valeur à une variable de rasoir à partir d'une variable javascript, est-il possible d'asp.net mvc razor view engine?
@{
int a = 0;
}
<script>
var b = ...
@a = b;
</script>
Tu ne peux pas. et la raison en est qu’elles ne "vivent" pas en même temps ... Les variables Razor sont des "variables côté serveur" et elles n'existent plus après l'envoi de la page au "côté client".
Lorsque le serveur reçoit une demande de vue, il crée la vue avec uniquement du code HTML, CSS et Javascript. Il ne reste aucun code C #, tout est "traduit" dans les langues côté client.
Le code Javascript n'existe pas lorsque la vue est toujours sur le serveur, mais il n'a pas de sens et ne sera exécuté que par le navigateur (à nouveau côté client).
C'est pourquoi vous pouvez utiliser les variables Razor pour modifier les codes HTML et Javascript, mais pas l'inverse. Essayez de regarder le code source de votre page (CTRL + U dans la plupart des navigateurs), il n’y aura aucun signe de code C #.
En bref:
Le serveur reçoit une requête.
Le serveur crée "prend" la vue, calcule et traduit tout le code C # incorporé dans la vue, en CSS, Javascript et HTML.
Mais cela serait possible si on utilisait la variable dans le champ @ html.Hidden . Comme dans cet exemple.
@Html.Hidden("myVar", 0);
définir le champ par script:
<script>
function setMyValue(value) {
$('#myVar').val(value);
}
</script>
J'espère que je peux au moins offrir aucune petite solution de contournement.
Ok, donc cette question est ancienne ... mais je voulais faire quelque chose de similaire et j'ai trouvé une solution qui fonctionne pour moi. Peut-être que cela pourrait aider quelqu'un d'autre.
J'ai un List<QuestionType>
avec lequel je remplis un menu déroulant. Je veux mettre cette sélection dans la propriété QuestionType
sur l'objet Question
que je crée dans le formulaire. J'utilise Knockout.js
pour la liaison de sélection. Ceci définit la propriété self.QuestionType
knockout observable sur un objet QuestionType
lorsque l'utilisateur en sélectionne un.
<select class="form-control form-control-sm"
data-bind="options: QuestionTypes, optionsText: 'QuestionTypeText', value: QuestionType, optionsCaption: 'Choose...'">
</select>
J'ai un champ caché qui contiendra cet objet:
@Html.Hidden("NewQuestion.QuestionTypeJson", Model.NewQuestion.QuestionTypeJson)
Dans l'abonnement à l'observable, j'ai défini le champ masqué sur une version JSON.stringify
- ed de l'objet.
self.QuestionType.subscribe(function(newValue) {
if (newValue !== null && newValue !== undefined) {
document.getElementById('NewQuestion_QuestionTypeJson').value = JSON.stringify(newValue);
}
});
Dans l'objet Question
, j'ai un champ appelé QuestionTypeJson
qui est rempli lorsque l'utilisateur sélectionne un type de question. J'utilise ce champ pour obtenir la QuestionType
dans l'objet Question
comme ceci:
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;
}
Donc, si le champ QuestionTypeJson
contient quelque chose, il le désérialisera et l'utilisera pour QuestionType
, sinon il utilisera simplement le contenu du champ de sauvegarde.
J'ai essentiellement «transmis» un objet JavaScript à mon modèle sans utiliser Razor
ni un appel Ajax
. Vous pouvez probablement faire quelque chose de similaire à ceci sans utiliser Knockout.js
, mais c'est ce que j'utilise alors ...
Étape: 1 Votre code html, .__ Commencez par stocker la valeur dans votre stockage local en javascript, puis ajoutez la ligne suivante
<label for="stringName" class="cols-sm-2 control-
label">@Html.Hidden("stringName", "")</label>
Étape: 2 Javascript
$('#stringName').replaceWith(localStorage.getItem("itemName"));
Je vois que ce problème a été discuté il y a un certain temps, mais si quelqu'un le revoit encore, voici ma solution:
Dans votre fichier * .cshtml View:
<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>
Le modèle de variable JavaScript est quelque chose que je dois transmettre à Razor ViewModel . Cela peut être fait avec une requête ajax. Il vous suffit d’avoir le bon argument/s dans votre action, qui correspond à l’objet Json créé en JavaScript.
J'espère que ça va aider quelqu'un!