Как я могу использовать один вид для редактирования 2 разных классов, имеющих общий базовый класс? - PullRequest
1 голос
/ 22 февраля 2012

Ну, мне нужно создать две анкеты, которые почти равны. Разница в том, что у одного есть вопрос больше, чем у другого. Поэтому я создал класс только с идентификатором (для персистентности), который будет базовым для обоих:

public class BaseQuizzClass{
    public int ID {get;set;}
} 

А потом я создал классы с почти одинаковыми именами для переменных (я думал, что это может помочь при использовании бритвы):

public class Quizz1 : BaseQuizzClass{

   [Display(Name="QuestionHere")]
   public string q1 {get;set;}

   [Display(Name="QuestionHere")]
   public string q2 {get;set;}

   ...

   [Display(Name="QuestionHere")]
   public string q9 {get;set;}
}

public class Quizz2 : BaseQuizzClass{
   [Display(Name="QuestionHere")]
   public string q1 {get;set;}

   [Display(Name="QuestionHere")]
   public string q2 {get;set;}

   ...

   [Display(Name="QuestionHere")]
   public string q9 {get;set;}

   [Display(Name="QuestionHere")]
   public string q10 {get;set;}
}

Затем я создал View, используя BaseQuizzClass в качестве модели, чтобы я мог передать дочерний класс в качестве параметра toit. Но я не знаю, как получить доступ к атрибутам дочерних классов.

ОБС .: Каждый вопрос имеет свой собственный текст, определенный в аннотации дисплея.

Есть ли способ сделать то, что я хочу? (Я не совсем уверен, если я был ясен)

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Я бы, наверное, немного переключил модель:

public class QuestionClass
{
  public String Question { get; set; }

  public String Answer { get; set; }
}

public class QuizzClass
{
  public Int32 ID { get; set; }

  [UIHint("Question")]
  public IList<QuestionClass> Questions { get; set; }
}

Затем создайте представление для вопроса и вместо использования [DisplayAttribute] используйте настройку «ключ / значение» объекта.

// ~/Views/_controller_/_action_.cshtml
@model QuizzClass

@using (Html.BeginForm())
{
  for (var q = 0; q < Model.Questions.Length; q++)
  {
    // ~/Views/Shared/EditorTemplates/Question.cshtml
    @Html.EditorFor(x => Model.Questions[q]);
  }
}

Кажется, что это слишком похоже на то, чтобы иметь такое сходство, но явно вызывать каждый вопрос в ваших "разных" объектах.

0 голосов
/ 22 февраля 2012

Я думаю, что ваша архитектура неисправна.Почему бы просто не иметь класс с коллекцией, которая содержит ваши вопросы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...