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



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

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

这是您的扩展方法/类

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 的标记帮助程序

说到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)