[英]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.