Witajcie,
Wiem, że temat niezrozumiały więc postaram się wyjaśnić.
W moim projekcie mam teraz stworzyć engine, który będzie się zajmować tworzeniem i wyświetlaniem testu - wczyta test z xmla, stworzy model z odpowiednimi zadaniami, wrzuci do view, a po wysłaniu sprawdzi,czy odpowiedzi zaznaczone/wpisane przez użytkownika są prawidłowe:
1.) Jeden test składa się z wielu zadań.
2.) Są 4 typy zadań: radiobutton, checkbox, combobox, oneanswer (odpowiadają one wyglądowi danego zadania)
3.) W widoku zadania są listowane.
Stworzyłem część ładującą zadania z dysku i generującą view, ale mam problem z odbieraniem listy odpowiedzi w kontrolerze - ponieważ oczekuję w kontrolerze na listę zadan bazowych kontroler szuka tylko pól pasujących do tego typu.
Kod poglądowy:
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; }
}
// Inne zadania, które mają pola odmienne niż 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>
Uciąłem trochę kodu, ale mam nadzieje, że widać istotę problemu.
Dodam, że jeśli do view wrzucam List<RadioButtonTaskModel> i taki pobieram przy HttpPost to mam wypełnioną liste odpowiedzi. Jednak przy pobieraniu List<TaskModel> szuka pól do klasy bazowej. Ma ktoś pomysł jak to obejść aby szukał dziedziczących i rzutował na bazowe?
A może to powinno się inaczej robić?