2014-01-14 2 views
1

Я пытаюсь реализовать основной опросник двигатель, который использует модель опросник, как показано ниже:MVC4 Generic Collection модель вопрос о POST

public class Questionnaire 
{ 
    public ICollection<Step> Steps { get; set; } 
} 

public class Step 
{ 
    ICollection<IQuestion> Questions { get; set; } 
} 

public class TextBoxQuestion : IQuestion 
{ 
    public QuestionTypeEnum QuestionType { get; set; } 
    public string QuestionText { get; set; } 
} 

public class DropDownQuestion : IQuestion 
{ 
    public QuestionTypeEnum QuestionType { get; set; } 
    public string QuestionText { get; set; } 
    public IList<string> Options { get; set; } 
} 

QuestionEditor шаблона:

@model IList<Models.IQuestion> 

@for (int i = 0; i < @Model.Count(); i++) 
{ 
    @Html.EditorFor(x => x[i], @Model[i].QuestionType.ToString()); 

} 

TextBoxQuestion Редактор:

public class TextBoxQuestion : IQuestion 
    { 
     public QuestionTypeEnum QuestionType { get; set; } 
     public string QuestionText { get; set; } 
    } 

Редактор DropDownQuestion:

public class DropDownQuestion : IQuestion 
    { 
     public QuestionTypeEnum QuestionType { get; set; } 
     public string QuestionText { get; set; } 
    } 

Грубо следующие Jon Egerton's example here Я реализую общий ICollection интерфейса IQuestion. MVC интерпретирует каждый тип IQuestion по своему типу и соответствующим образом отображает шаблон редактора TextBoxQuestion или DropDownQuestion. Отлично.

Однако, когда модель вопросника возвращается к контроллеру, коллекции IQuestion являются нулевыми.

Может ли кто-нибудь помочь мне с советом о том, есть ли лучший подход или я могу подключить DependencyResolver или что-то еще, чтобы MVC мог интерпретировать объекты IQuestion как типы TextBoxQuestion и DropDownQuestion?

Надеюсь, что это разъяснение ясно, не стесняйтесь задавать любые вопросы.

спасибо всем заранее

Марк

+0

ли вы следовать инструкциям из части 2 этой статьи? Без него связующее устройство по умолчанию не будет различать два конкретных типа, что означает, что оно вернет «null». –

+0

Да реализована часть 2 с пользовательской функциональностью ModelBinder, но я понимаю, что только разрешает конкретный тип для пройденной модели, и мне нужно разрешить конкретные типы для дочерних элементов IQuestion. Может, я что-то упустил? – Mark

ответ

0

Найдено решение для этого, если кто-то пытается достичь того же.

Эта статья on MSDN Magazine была чрезвычайно полезна.

В нем объясняются некоторые ключевые понятия, которые я не понимал, такие как привязка модели рекурсивно, поэтому обработка проходит весь граф объектов и применяет привязку модели для каждого типа.

Работа над абстрактной моделью общего назначения Binder была решением, которое я использовал вместе с пользовательским AbstractModelBinderProvider.

Надеется, что это помогает кто-то

Марке

Смежные вопросы