web-dev-qa-db-fra.com

Comment passer une valeur à une variable rasoir à partir d'une variable javascript?

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>
28
user4208535

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:

  1. Le serveur reçoit une requête.

  2. Le serveur crée "prend" la vue, calcule et traduit tout le code C # incorporé dans la vue, en CSS, Javascript et HTML.

  3. Le serveur renvoie la version côté client de la vue au navigateur en réponse à la demande. 
  4. le navigateur affiche la page et exécute tous les javascripts 
44
some_name

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.

31
Carsten Cors

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 ... 

1
Barry Franklin

É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"));
0
Bulelani Cimani

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!

0
Mjollnir951