从剃刀视图 ASP.NET Core 2.1 MVC 使用 ViewModel 方法

Using ViewModel method from a razor view ASP.NET Core 2.1 MVC

所以我有一个 ASP.NET Core 2.1 MVC 网络应用程序,其中包含使用这些视图模型的视图模型和 razorview。

在我的一个 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);}">

我似乎无法让它工作,所以这是要走的路还是我在做一些愚蠢的事情?

你最好使用扩展方法

这可能是您的模特

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

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

这是您的分机method/class

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 "";
            }
        }
    }
}

在你看来这样使用它。请记住包含 @using 子句

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

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

一个更优雅的解决方案是使用 .net core 的 tag helpers

说到 Extension Methods 我相信这将是扩展 HtmlHelper 的一个很好的用例在我看来 'rating style' 将在整个应用程序,如果您发现自己在多个应用程序中使用它 ViewModel,您可能会开始重复代码。

请注意,我不会在扩展中保留 private static string GetRatingStyle() 方法,我会将其提取到您的域或业务逻辑中 class。

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)