2016-08-21 1 views
1

Fondamentalement, j'ai un formulaire avec une zone de texte, un bouton radio et un contrôle case à cocher. maintenant je fais face à problème avec le contrôle de la case à cocher lorsque je soumets ma page J'ai un modèle comme celui-ciComment utiliser CheckBoxFor dans des formulaires MVC avec d'autres contrôles de formulaire

public class PersonDetails 
{ 
    public int personID { get; set; } 
    public string PersonName { get; set; } 
    public string Gender { get; set; } 
    public List<Education> Education { get; set; } 
    public string EmailID { get; set; } 
    public string Address { get; set; } 

} 

public class Education 
{ 
    public string Qualification { get; set; } 
    public bool Checked { get; set; } 

    public List<Education> GetQualification() 
    { 
     return new List<Education>{ 
    new Education {Qualification="SSC",Checked=false}, 
    new Education {Qualification="HSC",Checked=false}, 
    new Education {Qualification="Graduation",Checked=false}, 
    new Education {Qualification="PostGraduation",Checked=false} 
    }; 
    } 
} 

et j'ai vue comme celui-ci

@using (Html.BeginForm("GetDetails", "User", FormMethod.Post, new { id = "person-form" })) 
{ 
    <div class="col-xs-12"> 
    <label>Person Name</label> 
    @Html.TextBoxFor(x => x.PersonName) 
    </div> 
    <div class="col-xs-12"> 
    <label>Gender</label> 
    @Html.RadioButtonFor(x => x.Gender, "Male") 
    @Html.RadioButtonFor(x => x.Gender, "Female") 
    </div> 
    <div class="col-xs-12"> 
    <label>Education</label> 
    @{ 
    Html.RenderPartial("Qualification", new LearnAuthentication.Controllers.Education().GetQualification()); 
    } 

    </div> 

    <div class="col-xs-12"> 
    <input type="submit" value="Submit" /> 
    </div> 
} 

et la vue partielle comme celui-ci

@model List<LearnAuthentication.Controllers.Education> 
<br /> 
@for (int i = 0; i < Model.Count(); i++) 
{ 
    @Html.HiddenFor(x => Model[i].Qualification) 
    @Html.CheckBoxFor(x => Model[i].Checked) 
    @Html.DisplayFor(x => Model[i].Qualification) 
<br /> 
} 

et ma méthode d'action est ce

[HttpPost] 
public ActionResult GetDetails(PersonDetails personDetails) 
{ 
    return View(); 
} 

maintenant quand je lance mon application i ont tendance à obtenir toutes les informations, mais quand je soumets la page i obtenir cette propriété avec des valeurs nulles

Liste publique éducation {get; ensemble; }

pouvez-vous tous les gars m'aider sur ce que je fais mal ou pourriez-vous me diriger vers le bon chemin sur la façon d'y parvenir.

+0

@StephenMuecke il peut paraître drôle à vous, mais Je ne sais vraiment pas comment accepter les réponses, comme une appréciation je vote toujours pour la réponse qui m'aide :) en ce moment je passe par des blogs pour apprendre à voter pour la réponse .. merci et s'il vous plaît aider ma question si vous connaître la réponse –

+0

@StephenMuecke hey .. merci pour vos commentaires j'ai finalement appris à accepter les réponses ...merci encore une fois et s'il vous plaît laissez-moi savoir si vous connaissez la réponse à ma question :) –

Répondre

1

Votre utilisation d'une partie pour générer les commandes pour Education génère des entrées telles que

<input type="hidden" name="[0].Qualification" ... /> 
<input type="hidden" name="[1].Qualification" ... /> 

mais pour lier, ils doivent avoir le nom des attributs qui correspondent à votre modèle

<input type="hidden" name="Education[0].Qualification" ... /> 
<input type="hidden" name="Education[1].Qualification" ... /> 

Renommez-vous partiellement en Education.cshtml (pour correspondre au nom de la classe) et déplacez-le dans votre dossier /Views/Shared/EditorTemplates (ou /Views/yourControllerName/EditorTemplates si vous voulez un modèle spécifique uniquement pour ce contrôleur)

Ensuite, changez partielle

@model LearnAuthentication.Controllers.Education 

@Html.HiddenFor(m => m.Qualification) 
@Html.LabelFor(m => m.Checked) 
@Html.CheckBoxFor(m => m.Checked) 
@Html.DisplayFor(m => m.Qualification) 

et dans la vue principale remplacer

<label>Education</label> 
@{ Html.RenderPartial("Qualification", new LearnAuthentication.Controllers.Education().GetQualification()); } 

avec

<span>Education</span> // its not a label 
@Html.EditorFor(m => m.Education) 

qui correctement générer le code HTML correct pour chaque élément de votre collection

Note Side: D'autres solutions de rechange qui fonctionnerait serait de changer la signature de la méthode POST à ​​

[HttpPost] 
public ActionResult GetDetails(PersonDetails personDetails List<Education> educationDetails) 

ou pour passer le HtmlFieldPrefix à la partielle comme expliqué dans getting the values from a nested complex object that is passed to a partial view

+0

merci de votre réponse je l'apprécie :) –