2
votes

Comment utiliser correctement la liaison de modèle pour obtenir la valeur du bouton radio dans les pages Razor

J'ai un ensemble de boutons radio sur une page rasoir, et je veux obtenir et utiliser la valeur sélectionnée de ces boutons radio dans mon code côté serveur une fois le formulaire soumis. HTML pour les boutons radio:

{
    //stuff

    //now how the radio button values are actually used
    for (int param_i = 1; param_i <= Boost_No.Number; param_i++)
    {
          //...
    }
    //then a paramaterized sql database query
}

J'utilise la liaison de modèle pour obtenir la valeur côté serveur:

public IActionResult OnPostSubmit()
{
    //save data to sql db
    SaveData();

    //then some other unrelated stuff
}

Cette classe est instanciée comme suit:

[BindProperty]
public BoostNo Boost_No { get; set; }

Malheureusement, chaque fois que j'exécute le code, j'obtiens un Boost_No.Number = 0 . J'ai essayé de changer le type de données en une chaîne, mais j'obtiens simplement string = null .

J'essaie d'utiliser la variable liée au modèle dans la méthode de gestion attribuée au formulaire les boutons radio sont contenus dans.

J'apprécierais vraiment que quelqu'un puisse m'aider. Merci.

Modifier:

Voici la méthode de gestion dans laquelle la liaison de modèle est utilisée:

public class BoostNo
{
    [Required(ErrorMessage = "Select Number of Boost Units!")]
    public int Number { get; set; }
}

Et la méthode SaveData () :

public void SaveData ()

<label><input class="boost_radio" onclick="boostNo(1)" asp-for="Boost_No.Number" type="radio" name="boostno" value=1 checked="checked" disabled="disabled" />1</label>
<label><input class="boost_radio" onclick="boostNo(2)" asp-for="Boost_No.Number" type="radio" name="boostno" value=2 disabled="disabled" />2</label>
<label><input class="boost_radio" onclick="boostNo(3)" asp-for="Boost_No.Number" type="radio" name="boostno" value=3 disabled="disabled" />3</label>
<label><input class="boost_radio" onclick="boostNo(4)" asp-for="Boost_No.Number" type="radio" name="boostno" value=4 disabled="disabled" />4</label>
<span asp-validation-for="Boost_No.Number"></span>


7 commentaires

Montrez-vous le code d'action du contrôleur s'il vous plaît


@AntonToshik Il n'y a pas de contrôleurs dans les pages Razor


@MikeBrind Ce n'était pas une évidence, vous comprenez ce que je veux dire, n'est-ce pas? pourriez-vous montrer l'action OnPost () de Razor Page ou OnPostAsync () où publiez-vous ces données?


@AntonToshik Non - je n'ai pas compris ce que vous vouliez dire, c'est pourquoi j'ai fait ce commentaire. Beaucoup de gens voient le code de Razor Pages et demandent où se trouve le contrôleur, en supposant que la question concerne une application MVC mal séparée. Pour info, l'équivalent d'une "action de contrôleur" dans Razor Pages est une "méthode de gestion".


@MikeBrind Je suis désolé, je pensais que ce que je demandais était évident. Donc, je suppose que si vous souhaitez une question plus «correcte»: pourriez-vous s'il vous plaît me montrer l'action du contrôleur ou le gestionnaire de page rasoir sur lequel le formulaire est publié?


@AntonToshik question mise à jour


Pouvez-vous afficher la balise de formulaire?


3 Réponses :


1
votes

s'il s'agit de boutons radio individuels, vous devriez avoir une liaison individuelle pour chacun d'entre eux, pour l'instant vous l'utilisez pour chacun des boutons radio. (Boost_No.Number). Soit créer une liste de liste, puis lier un bouton radio individuel lik "Boost_No [0] .Number" ou créez des propriétés différentes pour chacune d'entre elles (votre choix)


0 commentaires

2
votes

Toutes vos entrées radio sont réglées sur désactivé donc aucune valeur ne sera transmise dans la collection de formulaires lorsque le formulaire est soumis. Supprimez les attributs disabled (et le name ) des entrées:

<label><input class="boost_radio" onclick="boostNo(1)" asp-for="Boost_No.Number" type="radio" value=1 checked="checked" />1</label>
<label><input class="boost_radio" onclick="boostNo(2)" asp-for="Boost_No.Number" type="radio"  value=2 />2</label>
<label><input class="boost_radio" onclick="boostNo(3)" asp-for="Boost_No.Number" type="radio"  value=3 />3</label>
<label><input class="boost_radio" onclick="boostNo(4)" asp-for="Boost_No.Number" type="radio"  value=4 />4</label>


0 commentaires

2
votes

Voici un exemple minimal que j'ai configuré pour le faire fonctionner.

Voici mon descripteur de page de rasoir et j'utilise la même implémentation de classe que vous.

<label><input asp-for="Boost_No.Number" type="radio value=1 checked="checked"/>1</label>
<label><input asp-for="Boost_No.Number" type="radio" value=2/>2</label>
<label><input asp-for="Boost_No.Number" type="radio" value=3/>3</label>
<label><input asp-for="Boost_No.Number" type="radio" value=4/>4</label>

Maintenant dans le HTML

[BindProperty]
public BoostNo Boost_No { get; set; }

public IActionResult OnPost()
{
    return Page();
}

Modifications:

  1. Commencez par supprimer l'attribut name . Pourquoi? car l'assistant de balise asp-for créera un attribut name pour vous. En plus de fournir un attribut name vous lui donnez une valeur de boostno , l'attribut name est utilisé pour lier la valeur au modèle, dans en d'autres termes, votre descripteur OnPost n'a pas de paramètre boostno où être lié.
  2. Deuxièmement, si un champ de saisie est désactivé , la valeur d’entrée sera ignorée. Je revérifierais cela avant de soumettre le formulaire, ouvrez les outils de développement (F12) et vérifiez les éléments de votre champ de saisie pour m'assurer qu'ils ne sont pas désactivés, même si l'interface utilisateur suggère le contraire.


0 commentaires