从剃刀视图 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)
所以我有一个 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)