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ć?