C#Asp网络核心MVC,从视图中的模型列表“ List <Movie>”中提取数据

问题描述

我想从Asp net core 3.1“ MvMovie”教程项目创建“最高价格”过滤器系统。 这是View / movies / Index.cshtml

@model MvcMovie.Models.MovieGenreviewmodel

    <select asp-for="MovieGenre" asp-items="Model.Genres">
        <option value="">All</option>
    </select>

    Title: <input type="text" asp-for="SearchString" />
    <input type="submit" value="Filter" />

    Max price <input type="text" asp-for="Movies" />
    <input type="submit" value="Filter" />
</p>

这就是我添加内容

Max price <input type="text" asp-for="Movies.price" />
    <input type="submit" value="Filter" />

问题是我无法从Movie类(模型/电影)中获得价格

 public class Movie
{
    public int Id { get; set; }

    [StringLength(60,MinimumLength = 3)]
    [required]
    public string Title { get; set; }

    [display(Name = "Release Date")]
    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }

    [Range(1,100)]
    [DataType(DataType.Currency)]
    [Column(TypeName = "decimal(18,2)")]
    public decimal Price { get; set; }

    [RegularExpression(@"^[A-Z]+[a-zA-Z]*$")]
    [required]
    [StringLength(30)]
    public string Genre { get; set; }

    [RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$")]
    [StringLength(5)]
    [required]
    public string rating { get; set; }
}

因为它正在使用@model MvcMovie.Models.MovieGenreviewmodel 型号/MovieGenreviewmodel.cs:

    public class MovieGenreviewmodel
{
    public List<Movie> Movies { get; set; }
    public SelectList Genres { get; set; }
    public string MovieGenre { get; set; }
    public string SearchString { get; set; }

}

我知道“价格”数据在列表中

List<Movie>

但是如何提取它并将其放入View / movies / Index.cshtml中,以便可以在价格过滤器系统上工作。

解决方法

您可以使用几个剃刀语句来操纵模型(在c#中),例如@foreach遍历电影并显示所有价格,或者@{var firstElementPrice=Movies[0].price}然后使用{{1} },因为您只想获取第一个的价格。

您可以在此处查看剃须刀页面的可用语法元素列表: https://docs.microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-3.1

,

添加属性公共十进制价格{get;组; }在MovieGenreViewModel类中,并将最高价格更改为

Max price <input type="text" asp-for="@Model.Price" />
    <input type="submit" value="Filter" />
,

在视图中绑定List集合的一般方法就像@ekke所说的那样,都在循环中,然后使用@Model.Movies[i].Price以这种方式进行绑定。但是在循环中会导致多个Input标签。

如果只需要一个输入,我认为最好的方法是通过输入输入一个MaxPrice,然后将此MaxPrice传递到后台进行过滤,然后返回过滤的数据。 / p>

这是一个工作示例:

控制器:

public IActionResult Index()
    {
        //the model is your selected data

        var model = new MovieGenreViewModel
        {
            SearchString = "aaaa",Genres = new List<SelectListItem> {
            new SelectListItem { Text = "AA",Value = "1"},new SelectListItem { Text = "BB",Value ="2"},new SelectListItem { Text = "CC",Value ="3" },},MovieGenre = "bbbb",Movies = new List<Movie>
            {
                new Movie{Id=1,Genre="a",Price=78,Rating="aa",ReleaseDate=DateTime.Now,Title="MOvie1"},new Movie{Id=2,Genre="b",Price=56,Rating="bb",Title="MOvie2"},}
        };
        return View(model);
    }
    [HttpPost]
    public IActionResult Index(decimal MaxPrice)
    {
        var model = new MovieGenreViewModel
        {
            SearchString = "aaaa",}
        };
        //filter movies
        var movies = model.Movies.Where(c => c.Price <= MaxPrice).ToList();
        model.Movies = movies;

        return View(model);
    }      

索引视图:

<select asp-for="MovieGenre" asp-items="Model.Genres">
<option value="">All</option>
</select>
Title:
<input type="text" asp-for="SearchString" />
<input type="submit" value="Filter" />
Max price:
<form asp-controller="Movie" asp-action="Index">
<input type="text" name="MaxPrice"  />
<input type="submit" value="Filter" />
</form>
<table class="table">
<tbody>
    @foreach (var item in Model.Movies)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Rating)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ReleaseDate)
            </td>
        </tr>
    }
</tbody>
</table>

结果: enter image description here