Asp.net core mvc 从razor视图使用ViewModel方法ASP.NET Core 2.1 MVC

Asp.net core mvc 从razor视图使用ViewModel方法ASP.NET Core 2.1 MVC,asp.net-core-mvc,viewmodel,asp.net-core-2.1,Asp.net Core Mvc,Viewmodel,Asp.net Core 2.1,因此,我有一个ASP.NET Core 2.1 MVC Web应用程序,其中包含viewmodels和使用这些viewmodels的razorviews 在我的一个Razor视图中,我需要根据评级为元素指定样式。我使用以下代码 public class MovieViewModel { public Movie Movie { get; set; } public string GetRatingStyle(double? rating) { if (!

因此,我有一个ASP.NET Core 2.1 MVC Web应用程序,其中包含viewmodels和使用这些viewmodels的razorviews

在我的一个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 "";
        }
    }
}
@model MovieViewModel
...
<div class="rating @{Model.GetRatingStyle(Model.Movie.Rating);}">
公共类电影视图模型
{
公共电影{get;set;}
公共字符串GetRatingStyle(双重评级)
{
如果(!rating.HasValue)
返回“”;
开关(额定值)
{
等级<2.5时的情况变量:
返回“低”;
当评级>=2.5和评级<5时的情况变量:
返回“中”;
当评级>=5和评级<7.5时的情况变量:
返回“中高”;
当评级>=7.5时的情况变量:
返回“高”;
违约:
返回“”;
}
}
}
我尝试用下面的代码在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 "";
        }
    }
}
@model MovieViewModel
...
<div class="rating @{Model.GetRatingStyle(Model.Movie.Rating);}">
@model moviewmodel
...

我似乎无法实现这一点,所以这是一种方式,还是我在做一些愚蠢的事情?

使用扩展方法应该更好

这可能是你的模型

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 "";
            }
        }
    }
}
使用AspNet.Core.Models;
命名空间AspNet.Core.Infrastructure
{
公共静态类扩展
{
公共静态字符串分级样式(此电影)
{
如果(!movie.Rating.HasValue)
返回“”;
开关(电影分级)
{
电影评级<2.5时的案例变量:
返回“低”;
当电影评级>=2.5和电影评级<5时的案例变量:
返回“中”;
当movie.Rating>=5和movie.Rating<7.5时的情况变量:
返回“中高”;
当电影评级>=7.5时的案例变量:
返回“高”;
违约:
返回“”;
}
}
}
}
在您的视图中这样使用它。记住包含@using子句

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

<div class="rating @Model.Movie.RatingStyle()">
@model AspNet.Core.Models.MovieViewModel
@使用AspNet.Core.Infrastructure

一个更优雅的解决方案是使用.NETCore的

扩展方法

这可能是你的模型

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 "";
            }
        }
    }
}
使用AspNet.Core.Models;
命名空间AspNet.Core.Infrastructure
{
公共静态类扩展
{
公共静态字符串分级样式(此电影)
{
如果(!movie.Rating.HasValue)
返回“”;
开关(电影分级)
{
电影评级<2.5时的案例变量:
返回“低”;
当电影评级>=2.5和电影评级<5时的案例变量:
返回“中”;
当movie.Rating>=5和movie.Rating<7.5时的情况变量:
返回“中高”;
当电影评级>=7.5时的案例变量:
返回“高”;
违约:
返回“”;
}
}
}
}
在您的视图中这样使用它。记住包含@using子句

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

<div class="rating @Model.Movie.RatingStyle()">
@model AspNet.Core.Models.MovieViewModel
@使用AspNet.Core.Infrastructure

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

说到扩展方法,我相信这将是扩展
HtmlHelper
的一个很好的用例。在我看来,“评级风格”将在整个应用程序中重复使用,如果您发现自己在多个
视图模型
中使用它,您可以开始重复代码

请注意,我不会在扩展中保留
私有静态字符串GetRatingStyle()
方法,我会将其提取到您的域或业务逻辑类中

HtmlHelperExtensions.cs
公共静态类HtmlHelperExtensions
{
公共静态IHtmlContent GetRatingStyle(此IHtmlHelper html,双重评级)
{
var tagBuilder=新tagBuilder(“div”);
tagBuilder.AddCssClass(GetRatingStyle(评级));
返回标记生成器;
}
私有静态字符串GetRatingStyle(双重评级)
{
如果(!rating.HasValue)
返回“”;
开关(额定值)
{
等级<2.5时的情况变量:
返回“低”;
当评级>=2.5和评级<5时的情况变量:
返回“中”;
当评级>=5和评级<7.5时的情况变量:
返回“中高”;
当评级>=7.5时的情况变量:
返回“高”;
违约:
返回“”;
}
}
}
使用:
@Html.GetRatingStyle(Model.Movie.Rating)
说到
扩展方法
我相信这将是扩展
HtmlHelper
的一个很好的用例。在我看来,“评级风格”将在整个应用程序中重复使用,如果您发现自己在多个
ViewModel
中使用它,您可以开始重复代码

请注意,我不会在扩展中保留
私有静态字符串GetRatingStyle()
方法,我会将其提取到您的域或业务逻辑类中

HtmlHelperExtensions.cs
公共静态类HtmlHelperExtensions
{
公共静态IHtmlContent GetRatingStyle(此IHtmlHelper html,双重评级)
{
var tagBuilder=新tagBuilder(“div”);
tagBuilder.AddCssClass(GetRatingStyle(评级));
返回标记生成器;
}
私有静态字符串GetRatingStyle(双重评级)
{
如果(!rating.HasValue)
返回“”;
开关(额定值)
{
等级<2.5时的情况变量:
返回“低”;
当评级>=2.5和评级<5时的情况变量:
返回“中”;
中科院