簡體   English   中英

C# Asp net core MVC,從模型列表中提取數據“列表”<Movie> &quot; 在視圖中

[英]C# Asp net core MVC, Extracting data from a Model list "List<Movie>" in a View

我想從 Asp net core 3.1“MvMovie”教程項目創建一個“最高價格”過濾系統。 這是視圖/電影/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" />

問題是我無法從電影類(模型/電影)收到價格

 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 Models/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 中,以便我可以在我的價格過濾系統上工作。

您可以使用多個 razor 語句來操作模型(在 c# 中),例如@foreach迭代電影並顯示所有價格或@{var firstElementPrice=Movies[0].price}然后像您一樣使用firstElementPrice希望檢索第一個的價格。

您可以在此處查看 razor 頁面的可用語法元素列表: https ://docs.microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-3.1。

添加屬性 public decimal Price { get; 放; 在你的類 MovieGenreViewModel 並將你的最高價格更改為

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

一般在view中綁定List集合的方法就跟@ekke說的一樣,都是在循環中然后用@Model.Movies[i].Price這種方式綁定。 但是在循環中會造成多個Input標簽。

如果只想要一個輸入,我覺得最好的辦法是通過input輸入一個MaxPrice ,然后把這個MaxPrice傳給后台進行過濾,然后返回過濾后的數據。

這是一個工作演示:

控制器:

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",ReleaseDate=DateTime.Now,Title="MOvie2"},
            }
        };
        return View(model);
    }
    [HttpPost]
    public IActionResult Index(decimal MaxPrice)
    {
        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",ReleaseDate=DateTime.Now,Title="MOvie2"},
            }
        };
        //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>

結果: 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM