2011-09-08 5 views
1

J'ai un projet MVC.MVC Binding Data

J'ai des questions dans une base de données à laquelle mes utilisateurs doivent répondre. Je les ai dans la base de données parce qu'ils doivent pouvoir être dynamiques. L'utilisateur doit soumettre une réponse pour chaque question. Ainsi, lorsque la vue s'affiche, elle affiche la question et une zone de texte pour chaque question.

Quelle serait la meilleure façon de s'y prendre comme je ne suis pas veulent coder en dur dans la question comme @ Html.TextBox ("Question1"), etc.

  1. Question 1 [__ textbox1 ___]
  2. question 2 [__ TextBox2 ___]

... etc

Répondre

1

Je possède probablement un ViewModel qui contient une collection d'un type QuestionResponder personnalisé.

IEnumerable<IQuestionResponder> Questions{get;set;} 

public interface IQuestionResponder{ 
    Guid QuestionId{get;set;} 
    string Question{get;set;} 
    string Answer{get;set;} 
} 

Ensuite, vous pouvez créer les éléments d'affichage dont vous avez besoin pour votre nouveau modèle de vue.

@for(var i = 0; i <= questionList .Count; i++) 
{ 
    @Model.Questions.ToList()[i].Question 
    @Html.TextBoxFor(m => m.Questions.ToList()[i].Answer) 
} 

Alternartively vous pouvez créer un EditorTemplate pour éviter une boucle dans votre vue:

insdie ~/Views/Shared/EditorTemplates/ ajouter une nouvelle vue appelée QuestionResponder (le nom de votre classe personnalisée).

Dans ce modèle, vous pouvez ensuite ajouter:

@model MyApp.Models.QuestionResponder 
<div> 
    @Html.DisplayFor(m => m.Question) 
    @Html.TextBoxFor(m => m.Answer) 
</div> 

Alors que vous appelez de votre alors vue original:

@Html.EditorFor(m => m.Questions) 
1

Il y a de fonction intégrée dans le faire MVC. D'une manière très simple, au fait. Il existe de nombreuses alternatives, jetez un oeil à this article by Phil Haack pour les inspecter tous. L'un d'entre eux est avec des dictionnaires. Quesion.Id sera la clé, réponse sera la valeur

Exemples:

En premier lieu, créer ViewModels appropriés

public class AnswerQuestionViewModel 
    { 
     public Quesion Question { get; set; } 
     public string Answer { get; set; } 
    } 
    public class Quesion // 
    { 
     public int Id { get; set; } 
     // Maybe some other properties. 
    } 

intérieur ~/Views/Shared/EditorTemplates/, créez éditeur qui rendra éditeur.

@model Models.AnswerQuestionViewModel 

    @Html.HiddenFor(model => model.Question.Id) 
    @Html.EditorFor(model => model.Answer) 

Et ~/Views/ControllerName/ActionName.cshtml

@model IEnumerable<ControllerInspectorTest.Models.AnswerQuestionViewModel> 
@using (Html.BeginForm()) 
{    
    @Html.EditorForModel(); 

    <p> 
     <input type="submit" value="Create" /> 
    </p>       
} 

Et lorsque vous créez une action post, le paramètre sera rempli

[HttpPost] 
public ActionResult AnswerQuestions(IEnumerable<AnswerQuestionViewModel> quesions) 
{ 
    // questions parameter is filled in correctly 
    //do save job; 
} 

Notez que la question paramètre par type de IList ou List trop