2011-09-08 65 views
1

我有一个MVC项目。MVC绑定数据

我在数据库中有问题,我希望我的用户回答。我有他们在数据库中,因为他们需要能够动态。用户需要提交每个问题的答案。所以当视图显示时,它会显示每个问题的问题和文本框。

以何种手段去这样做,因为我要像@ Html.textBox(“问题1”)等

  1. 问题1 在提问硬编码__的最佳方式TextBox1中 ___]
  2. 问题2 [__ TextBox2中 ___]

...等

回答

1

我可能有一个ViewModel包含一个自定义QuestionResponder类型的集合。

IEnumerable<IQuestionResponder> Questions{get;set;} 

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

然后,您可以创建新视图模型所需的显示项目。

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

Alternartively您可以创建一个EditorTemplate,以避免在您看来循环:

Insdie ~/Views/Shared/EditorTemplates/添加一个名为QuestionResponder新视图(自定义类的名称)。

内部的模板,可以再加入:

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

当你再从原来的观点称:

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

有做,在MVC的内置方式。顺便说一下,非常简单的方法。有很多选择,请看this article by Phil Haack来检查它们。其中之一是与字典。 Quesion.Id将是关键,答案将是价值

样品:

首先,建立适当的ViewModels

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

里面~/Views/Shared/EditorTemplates/,创建编辑器,将呈现编辑器。

@model Models.AnswerQuestionViewModel 

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

而且~/Views/ControllerName/ActionName.cshtml

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

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

而且当你创建动作后,参数将在

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

注意填写该质疑参数可以按类型的IListList