Специфичный для представления код форматирования в ASP.net MVC - PullRequest
1 голос
/ 19 июля 2009

Просто какой-то архитектурный вопрос: я использую ASP.net MVC и исключительно полагаюсь на строго типизированные представления с классами моделей представлений.

Поскольку представление является задачей представления, эти классы содержат не только некоторые поля, но также некоторые функции форматирования, например,

// The ViewModel contains a List<Comment> which the view.aspx iterates
// through, calling this function in a foreach-loop
// PostingDateFormat and DesiredCulture are fields set by the controller,
// and I don't know if they should be
public string GetCommentDateLine(Comment c)
{
    return c.CommentDate.ToString(this.PostingDateFormat, this.DesiredCulture);
}

Мне просто интересно, правильно ли это, или я должен перенести это куда-нибудь еще? Это особенно важно для функций, используемых множественными представлениями. Должны ли они жить в особом классе за пределами иерархии? Или быть скопированы / вставлены (yikes) в каждый класс View Model?

Это также учитывая тот факт, что у меня может быть несколько представлений в одной и той же модели представления: обычное представление для браузеров, другое представление для читателей RSS. Естественно, контроллер должен только заполнять модель представления данными, а само представление должно форматировать данные в соответствии с целевым носителем (т.е. даты в каналах RSS форматируются иначе, чем даты на обычных веб-сайтах). У меня должны быть отдельные ViewModel для Нормального и RSS? Или контроллер должен знать, что я хочу поле RSS, и заполнить поле «PostingDateFormat» другим значением? Это кажется лучшим решением (нет необходимости дублировать ViewModels для каждого представления), но я не уверен, что задачей контроллера является узнать, какой DateFormat нужен представлению.

1 Ответ

2 голосов
/ 19 июля 2009

Я бы предложил использовать всю логику форматирования вашего представления в методах расширения HtmlHelper. Таким образом, ваши view-модели не будут содержать никакой логики форматирования и будут просто делать то, для чего они предназначены - переносить объекты из контроллера в представление.

Так что в вашем случае, я думаю, вы бы создали что-то вроде:

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
        public static string CommentDateLine(this HtmlHelper html,
                                             Comment comment,
                                             string format,
                                             IFormatProvider formatProvider)
        {
            return comment.CommentDate.ToString(format, formatProvider);
        }
    }
}

Что касается проблемы PostingDateFormat, как вы намекаете, я бы определенно не создавал отдельные ViewModels для каждого представления. Вы можете создать отдельный метод расширения для форматирования даты RSS (что, возможно, избавит от необходимости устанавливать PostingDateFormat во ViewModel?).

HTHS
Charles

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