我有一个MVC项目。
我在数据库中有问题,希望我的用户回答。我把它们放在数据库中因为它们需要能够是动态的。用户需要为每个问题提交答案。因此,当显示视图时,它会显示每个问题的问题和文本框。
在不想要在@ Html.textBox(“Question1”)等问题中进行硬编码时,最好的方法是什么?
......等等。
答案 0 :(得分: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)
}
另外,您可以创建一个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 :(得分: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;
}
请注意,问题参数的类型可以是IList
或List