ASP.NET MVC - Является ли ViewModel подходящим местом для небольших вычислений? - PullRequest
2 голосов
/ 07 ноября 2010

Я работаю над UserViewModel, и мне интересно, уместно ли делать небольшие вычисления в ВМ, или мне нужно разделить его дальше и вычислить в другом месте.

Public Class UserViewModel
    Public Property UserName As String
    Public Property Email As String
    Public Property Website As String
    Public Property ID As Integer
    Public Property OpenIds As List(Of OpenID)
    Public Property UserAge As String
    Public Property About As String
    Public Property Slug As String
    Public Property LastSeen As String
    Public Property Region As String
    Public Property MemberSince As String
    Public Property Reputation As String
    Public Property isUserMatch As Boolean = False
    Private MarkDownSharp As MarkdownSharp.Markdown

    Public Sub New(ByVal user As User)
        Dim currentuser As Authentication.AuthUserData = Authentication.CustomAuthentication.RetrieveAuthUser
        MarkDownSharp = New MarkdownSharp.Markdown
        With MarkDownSharp
            .AutoHyperlink = False
            .AutoNewLines = True
            .EncodeProblemUrlCharacters = True
            .LinkEmails = True
            .StrictBoldItalic = True
        End With

        _UserName = If(Not user.UserName Is Nothing, user.UserName, "User" & user.ID.ToString)
        _Email = user.Email
        _Website = user.WebSite
        _ID = user.ID
        _OpenIds = user.OpenIDs.ToList
        ''# Converts the users birthdate to an age representation
        ''#      IE: 29
        _UserAge = user.BirthDate.ToAge

        ''# Because some people can be real ass holes and try to submit bad
        ''# data (scripts and shitè) we have to modify the "About" content in
        ''# order to sanitize it.  At the same time, we transform the Markdown
        ''# into valid HTML. The raw input is stored without sanitization in
        ''# the database.  this could mean Javascript injection, etc, so the
        ''# output ALWAYS needs to be sanitized.
        _About = Trim(Utilities.HtmlSanitizer.Sanitize(MarkDownSharp.Transform(user.About)))

        ''# Removes spaces from Usernames in order to properly display the
        ''# username in the address bar
        _Slug = Replace(user.UserName, " ", "-")

        ''# Returns a boolean result if the current logged in user matches the
        ''# details view of the user in question.  This is done so that we can
        ''# show the edit button to logged in users.
        _isUserMatch = If(currentuser.ID = user.ID, True, False)


        ''# Grabs the users registration data and formats it to a time span
        ''# The "timeago-nosuffix" CssClass is there to remove the "ago"
        ''# suffix from the "member for" string. Cuz when you think about
        ''# it... "Member for 5 days ago" just sounds stupid.
        _MemberSince = user.MemberSince.ToTimeSpan("timeago-nosuffix")

        ''# Grabs the users last activity and formats it to a time span
        _LastSeen = user.ActivityLogs.Reverse.FirstOrDefault.ActivityDate.ToTimeSpan("timeago", "ago")

        ''# Formats the users reputation to a comma Deliminated number 
        ''#    IE: 19,000 or 123k
        _Reputation = user.Reputation.ToShortHandNumber


        ''# Get the name of the users current Region.
        _Region = user.Region.Region.FirstOrDefault
    End Sub

End Class

Ответы [ 2 ]

5 голосов
/ 07 ноября 2010

Если эти вычисления касаются форматирования для данного представления, то это точное место. Кажется, вы делаете именно это: форматирование для представления в порядке (извините, если я что-то пропустил, мои навыки чтения кода VB.NET начинают ускользать от меня :-)). Если, с другой стороны, это некая логика предметной области, то, вероятно, она лучше подходит для модели, чтобы ее можно было использовать повторно.

3 голосов
/ 07 ноября 2010

Хотя я не согласен с Дарином, есть другой подход.

Вместо того, чтобы помещать простую логику в ваши ViewModels, вы также можете поместить эту логику в любой слой, который вы используете для преобразования объектов модели домена в объекты dto или viewmodel. Давайте назовем это вашим слоем Mapping. Это делает ваши модели представления действительно тупыми и гибкими, сохраняя всю пользовательскую логику преобразования представления в отдельном месте.

Использование такого инструмента, как AutoMapper, делает это действительно простым.

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