В моем проекте мне нужно написать тестовый движок, который будет читать тестовые задачи из файла, и создавать представление, где люди будут отвечать:
- Один тест имеет много задач (список задач).
- Существует 4 типа задач: радиокнопка, флажок, поле со списком, один ответ.
- В списке будут перечислены все задачи из теста.
У меня естьнаписанная часть, которая читает из файла и создает представление, но у меня проблемы с получением ответов в контроллере - контроллер ищет только базовые свойства viewModel.
Я сделал это так:
Model.cs
public enum TaskTypeEnum
{
RadioButton, CheckBox, ComboBox, OneAnswer
}
public abstract class TaskModel
{
public abstract TaskTypeEnum TaskType { get; }
public string Question { get; set; }
public int TaskId { get; private set; }
}
public class RadioButtonTaskModel : TaskModel
{
public override TaskTypeEnum TaskType { get { return TaskTypeEnum.RadioButton; } }
public List<string> Answers { get; set; }
public string SelectedAnswer { get; set; }
}
// Other tasks have different properties than RadioButtonTaskModel
ModelController.cs
public ActionResult SolveTest()
{
List<TaskModel> taskList = GetTasksFromFile();
return View(list);
}
[HttpPost]
public ActionResult SolveTest(List<TaskModel> taskList)
{
// do something with task list
}
SolveTest.cshtml
@model List<TaskModel>
<h2>SolveTest</h2>
<div>
@using (Html.BeginForm())
{
foreach (var task in Model)
{
<div>
<div>@task.Question</div>
@if (task.TaskType == TaskTypeEnum.RadioButton)
{
Html.RenderPartial("RadioButtonTaskView", task);
}
</div>
}
<p>
<input type="submit" value="Solve" />
</p>
}
</div>
RadioButtonTaskView.cshtml
@using MvcApplication2.Models;
@model RadioButtonTask
<div>
<ul>
@foreach (var answer in Model.Answers)
{
<li>
@Html.RadioButtonFor(
m => m.SelectedAnswer,
answer,
new { name = String.Format("taskList[{0}].SelectedAnswer", Model.TaskId) }
// it's for making sure, that controller will see that answer as part of list
// works fine, when main model is List<RadioButtonTaskModel>
);
@answer
</li>
}
</ul>
</div>
Я вырезал некоторый код, изКонечно, но я думаю, что этого достаточно, чтобы понять, какова ситуация.
Проблема в том, что контроллер в HttpPost SolveTest ищет только свойства, которые содержатся в базовой задаче.Как заставить его искать свойства унаследованных классов?
Или, может быть, я делаю это совершенно неправильно, и есть более простой способ составить список виртуальных машин?