Использование метода ViewModel из бритвенного представления ASP.NET Core 2.1 MVC - PullRequest
0 голосов
/ 24 октября 2018

Итак, у меня есть веб-приложение ASP.NET Core 2.1 MVC с моделями представления и бритвами, которые используют эти модели.

В одном из моих представлений Razor мне нужно назначить стили для элемента на основе рейтинга.Я использую следующий код

public class MovieViewModel
{
    public Movie Movie { get; set; }

    public string GetRatingStyle(double? rating)
    {
        if (!rating.HasValue)
            return "";
        switch (rating)
        {
            case var _ when rating < 2.5:
                return "low";
            case var _ when rating >= 2.5 && rating < 5:
                return "medium";
            case var _ when rating >= 5 && rating < 7.5:
                return "medium-high";
            case var _ when rating >= 7.5:
                return "high";
            default:
                return "";
        }
    }
}

Я пытаюсь применить его в моем представлении Razor со следующим кодом

@model MovieViewModel
...
<div class="rating @{Model.GetRatingStyle(Model.Movie.Rating);}">

Я не могу заставить это работать, так что этопуть или я делаю что-то глупое?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Говоря о Extension Methods Я считаю, что это был бы хороший вариант использования для расширения HtmlHelper Мне кажется, что «стиль оценки» будет повторно использоваться во всем приложении, и если вы обнаружите, что используетеэто более чем в одном ViewModel, вы можете начать повторять код.

Заметьте, я бы не стал хранить метод private static string GetRatingStyle() в расширениях, я бы извлек его в ваш домен или класс бизнес-логики..

HtmlHelperExtensions.cs

public static class HtmlHelperExtensions
{
    public static IHtmlContent GetRatingStyle(this IHtmlHelper html, double? rating)
    {
        var tagBuilder = new TagBuilder("div");
        tagBuilder.AddCssClass(GetRatingStyle(rating));
        return tagBuilder;
    }

    private static string GetRatingStyle(double? rating)
    {
        if (!rating.HasValue)
            return "";
        switch (rating)
        {
            case var _ when rating < 2.5:
                return "low";
            case var _ when rating >= 2.5 && rating < 5:
                return "medium";
            case var _ when rating >= 5 && rating < 7.5:
                return "medium-high";
            case var _ when rating >= 7.5:
                return "high";
            default:
                return "";
        }
    }
}

Использование:

@Html.GetRatingStyle(Model.Movie.Rating)

0 голосов
/ 24 октября 2018

Вам лучше использовать методы расширения

Это может быть ваша модель

namespace AspNet.Core.Models
{
    public class MovieViewModel
    {
        public Movie Movie { get; set; }
    }

    public class Movie
    {
        public float? Rating { get; set; }
    }
}

Это ваш метод расширения / класс

using AspNet.Core.Models;

namespace AspNet.Core.Infrastructure
{
    public static class Extensions
    {
        public static string RatingStyle(this Movie movie)
        {
            if (!movie.Rating.HasValue)
                return "";
            switch (movie.Rating)
            {
                case var _ when movie.Rating < 2.5:
                    return "low";
                case var _ when movie.Rating >= 2.5 && movie.Rating < 5:
                    return "medium";
                case var _ when movie.Rating >= 5 && movie.Rating < 7.5:
                    return "medium-high";
                case var _ when movie.Rating >= 7.5:
                    return "high";
                default:
                    return "";
            }
        }
    }
}

Используйте егокак это на ваш взгляд.Не забудьте включить @ с использованием предложения

@model AspNet.Core.Models.MovieViewModel
@using AspNet.Core.Infrastructure

<div class="rating @Model.Movie.RatingStyle()">

Еще более элегантным решением было бы использование помощников по тегам .net core

...