MVC affiche une liste d'objets complexes
J'ai un FeedbackViewModel qui contient une liste de questions:
public class FeedbackViewModel
{
public List<QuestionViewModel> Questions { get; set; }
}
Ce QuestionViewModel est un objet qui peut être hérité par les 5 différents types de questions
public class QuestionViewModel
{
public string QuestionText { get; set; }
public string QuestionType { get; set; }
}
Un exemple de l'héritage types de question:
public class SingleQuestionViewModel : QuestionViewModel
{
public string AnswerText { get; set; }
}
Dans le HttpGet
de la Index
action dans le contrôleur-je obtenir les questions de la base de données et ajouter le bon type de question dans la liste de la question dans le FeedbackViewModel
Puis-je rendre ce modèle dans la vue:
@using (Html.BeginForm())
{
//foreach (var item in Model.Questions)
for (int i = 0; i < Model.Questions.Count; i++)
{
<div class="form-group">
@Html.DisplayFor(modelItem => Model.Questions[i].QuestionText, new { @class = "control-label col-md-4" })
<div class="col-md-6">
@if (Model.Questions[i].QuestionType == "Single")
{
@Html.EditorFor(modelItem => (Model.Questions[i] as OpenDataPortal.ViewModels.SingleQuestionViewModel).AnswerText)
}
else if (Model.Questions[i].QuestionType == "Multiple")
{
@Html.TextAreaFor(modelItem => (Model.Questions[i] as OpenDataPortal.ViewModels.SingleQuestionViewModel).AnswerText)
}
else if (Model.Questions[i].QuestionType == "SingleSelection")
{
@Html.RadioButtonForSelectList(modelItem => (Model.Questions[i] as OpenDataPortal.ViewModels.SingleSelectionQuestionViewModel).SelectedAnswer,
(Model.Questions[i] as OpenDataPortal.ViewModels.SingleSelectionQuestionViewModel).SelectionAnswers)
}
else if (Model.Questions[i].QuestionType == "MultipleSelection")
{
@Html.CustomCheckBoxList((Model.Questions[i] as OpenDataPortal.ViewModels.MultipleSelectionQuestionViewModel).AvailableAnswers)
}
else if (Model.Questions[i].QuestionType == "UrlReferrer")
{
@Html.EditorFor(modelItem => (Model.Questions[i] as OpenDataPortal.ViewModels.SingleQuestionViewModel).AnswerText)
}
</div>
</div>
<br />
}
<br />
<button type="submit">Submit</button>
}
Maintenant, je ne peux tout simplement pas l'obtenir pour publier la liste de questions dans le modèle. Est-il même possible d'afficher une liste des différents types d'objets?
Edit: qui Suit est la liste de données dans le post que j'ai découvert à l'aide de Fiddler:
source d'informationauteur Carel
Vous devez vous connecter pour publier un commentaire.
Merci de me pointer dans la bonne direction avec ce post. J'ai eu du mal à obtenir la syntaxe de droit pour la liaison non-séquentielle
IDictionary<string, bool>
objet. Pas sûr que ce est correct à 100%, mais ce Rasoir code a fonctionné pour moi:Si vous avez besoin d'une case, assurez-vous d'utiliser le langage Html.Case à cocher à la place d'une norme HTML case. Le modèle va exploser si une valeur n'est pas fournie, et Html.Case génère un champ caché pour assurer une valeur est présente lorsque la case n'est pas cochée.
Assurez-vous que vous effectuez le rendu de la vue, de sorte que
Model.Questions[i]
rend dans l'ordre.Par exemple,
Model.Questions[0], Model.Questions[1], Model.Questions[2]
.J'ai remarqué que si la commande n'est pas correcte liant de modèle mvc ne liera le premier élément.
À l'aide de Rasoir, vous pouvez mettre en œuvre pour la boucle à l'aide d'un dictionnaire comme suit sans apporter de modifications à votre objet:
La collection doit être une Liste ou un Tableau pour que cela fonctionne.
J'utilise ce code peut-être que sa peut vous aider