Как должна выглядеть моя модель для упрощенной страницы вопросов и ответов о переполнении стека - PullRequest
1 голос
/ 23 декабря 2011

Я впервые пробую MVC и пытаюсь создать очень упрощенную версию StackOverflow.У меня есть таблицы моделей / баз данных, такие как:

Users
Questions
Answers
Comments

и некоторые ViewModels этих моделей, которые я использую для представлений.Отношения между моделями:

Users 1:m  with Questin, Answers, Comments
Questions 1:m with Answers, Comments
Answers 1:m with Comments

и

Users m:m Questions
Users m:m Answers

для голосов.

Как должна выглядеть моя ViewModel для страницы вопросов, которая является такой жекак эта страница, с которой вы сейчас это читаете?Страница должна быть примерно такой:

-----------------------ВопросОтветОтвет...ОтветФорма для ответа на вопрос только для зарегистрированных пользователей-----------------------и список комментариев под Вопросом и ответами

Я придумываю следующее:

public class QuestiongView
{
   public QuestionShort question { get; set;}
   public IEnumerable<AnswerShort> answers { get; set;}
   public AnswerWritabelByUser answerByUser {get; set;}  // only for logged in usesr. This is where you type your answer
}

, QuestionShort и AnswerShort - это классы, в которых List<Comments>.Для голосования я бы использовал $ .ajax звонки.С тем, что я узнал до сих пор, я думаю, что это правильный способ сделать это, но это также кажется грязным.Возможно, я буду использовать частичное представление для очистки кода в View.

Итак, это правильный способ реализации MVC, есть ли у вас предложения по улучшению всего моего подхода к этой конкретной проблеме, знаю ли яо чем я говорю или я пропустил весь шаблон дизайна / концепцию MVC?

1 Ответ

2 голосов
/ 23 декабря 2011

Я бы сделал что-то очень похожее на:

Модели

public QuestionViewModel : IQuestionViewModel
{
  public QuestionModel : Question { get; set; }
}

public IQuestionViewModel
{
  QuestionModel: Question { get; }
}

public QuestionModel : IAnswersViewModel, ICommentsViewModel, IUserViewModel
{
  public string Title { get; set; }
  public string Summary { get; set; }
  public IENumerable<Tag> Tags { get; set; }
  public UserModel User { get; set; }

  public IEnumerable<AnswerModel> Answers { get; set; }

  public IEnumerable<CommentModel> Comments { get; set; }
}

public IAnswersViewModel
{
  IEnumerable<AnswerModel> Answers { get; }
}

public ICommentsViewModel
{
  IEnumerable<CommentModel> Comments { get; }
}

public IUserViewModel
{
  UserModel User { get; }
}

public AnswerModel : ICommentsViewModel, IUserViewModel
{
  public Summary { get; set; }
  public UserModel { get; set; }

  public IEnumerable<CommentModel> Comments { get; set; }
}

public CommentModel : IUserViewModel
{
  public string Summary { get; set; }
  public UserModel User { get; set; }
}

public UserModel 
{
  public string Name { get; set ; }
}

Контроллер

public class QuestionController : Controller
{
  public ActionResult Details(int QuestionID)
  {
    // Populate the model as you see fit
    // I normally have my models populate themselves
    // So I don't duplicate code in my controllers

    QuestionViewModel model = QuestionViewModel.Get(QuestionID)

    if (model == null)
    {
      return this.UnavailableQuestion()
    }

    return this.View(model);
  }

  // Questions that don't exist
  public ActionResult UnavailableQuestion
  {
    return this.View();
  }
}

** Виды (все ОЧЕНЬ упрощенно) **

Вопрос \ Details.cshtml

@Model IQuestionViewModel

@model.Question.Title

@model.Question.Summary

@html.Partial("partial-UserComplex", model.Question)

@html.Partial("partial-Comments", model.Question)

@html.Partial("partial-Answers", model.Question);

Shared \partal-UserComplex.cshtml

@Model IUserViewModel   

//Complex might display details like points, etc etc
@model.User.Name

Shared \partal-UserSimple.cshtml

@Model IUserViewModel   

//Simple would just have a name with a link to profile
@model.User.Name

Shared \partal-Comments.cshtml

@Model ICommentsViewModel

@foreach (CommentModel comment in model.Comments)
{
  @comment.Summary
  @Html.Partial("partial-UserSimple", comment)
}

Вопрос \ частичное-Ответы.cshtml

@Model IAnswersViewModel

@foreach (AnswerModel answer in model.Answers)
{
  @answer.Summary

  @Html.Partial("partial-UserComplex", answer)

  @Html.Partial("partial-Comments", answer)
}

PROS

  • Каждый View / PartialView использует интерфейс, поэтому я могусоздайте столько разных моделей, сколько мне нужно, и повторно используйте один и тот же вид.
  • Так как отображение Комментариев (Может быть?) и пользователей будет происходить по всему сайту, я могу легко повторно использовать партиалы в общем каталоге
  • Отображение ответов, комментариев и пользователей полностью отделено друг от друга.
  • Очень расширяемый.

CONS

  • ИспользованиеИнтерфейсы в представлениях немного сложныlex, потому что все, что вы хотите добавить, вы должны добавить в интерфейс И любой класс, который наследует интерфейс.
  • Это довольно сложный процесс, основанный на количестве подклассов и повторном использовании моделей.
...