Рендеринг действия действия - PullRequest
2 голосов
/ 01 февраля 2012

У меня есть вид, который отображает вопрос, ответы, комментарии к ответам и на вопрос.

Чтобы отобразить все данные, я хочу использовать что-то вроде этого:

    [HttpGet, ChildActionOnly]
    public PartialViewResult RenderQuestion(int questionId, int page, int pageSize, string sort)//For question display
    {
        var question = questionsService.GetQuestion(questionId);
        var author = userService.GetUser(question.AuthorId);
        var commentIds = commentService.GetTopCommentIds(questionId, int.MaxValue, CommentType.Question);
        var answerIds = answerService.GetAnswerIdsByQuestion(page, pageSize, questionId, sort);
        var model = new QuestionModel{ Question = question, Author = author, CommentIds = commentIds, AnswerIds = answerIds}
        return PartialView("_Question", model);
    }
    [HttpGet, ChildActionOnly]
    public PartialViewResult RenderAnswer(int answerId)
    {
        var answer = answerService.GetAnswer(answerId);
        var author = userService.GetUser(answer.AuthorId);
        var commentIds = commentService.GetTopCommentIds(answerId, int.MaxValue, CommentType.Answer);
        var model = new AnswerModel { Answer = answer, Author = author, CommentIds = commentIds};
        return PartialView("_Answer");
    }

    [HttpGet, ChildActionOnly]
    public PartialViewResult RenderComment(int commentId, CommentType commentType)
    {
        var comment = commentService.GetComment(commentId, commentType);
        var author = userService.GetUser(comment.AuthorId);
        var model = new CommentModel { Comment = comment, Author = author};
        return PartialView("_Comment");
    }

И в моем частичномнапример, представления для вопроса, который я буду повторять в цикле Model.AnswerIds и вызывать @{ Html.RenderAction("RenderAnswer", new {answerId}) }; и Model.CommentIds и вызывать @{ Html.RenderAction("RenderComment", new {commentId}) };

Я хочу знать, является ли это хорошим способом декомпозиции представления и будет ли такимеют плохое влияние на производительность, часто @Html.RenderAction звонки.

1 Ответ

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

К сожалению, это приведет к снижению производительности. RenderAction не известен своей невероятной скоростью.

Вы также будете создавать экземпляр вашего контроллера несколько раз (возможно, открываете базу данных также несколько раз).

Я рекомендую вам поместить все в одно специализированное действие контроллера.

...