【问题标题】:C# Asp net core MVC, Extracting data from a Model list "List<Movie>" in a ViewC# Asp net core MVC,从视图中的模型列表“List<Movie>”中提取数据
【发布时间】:2020-11-03 21:03:25
【问题描述】:

我想从 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" />

问题是我无法从电影类(模型/电影)中收到价格

 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# asp.net-mvc model asp.net-core-mvc


    【解决方案1】:

    您可以使用多个 razor 语句来操作模型(在 c# 中),例如 @foreach 迭代电影并显示所有价格或 @{var firstElementPrice=Movies[0].price} 然后使用 firstElementPrice 来检索只是第一个的价格。

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

    【讨论】:

    • 非常感谢您的回答先生,但我的主要问题是如何在 index.cshtml 中创建一个输入,该输入可以读取其他模型类中的“价格”数据(电影.cs)目前在 index.cshtml“@model MvcMovie.Models.MovieGenreViewModel”之上,我不能将它用于其他任何东西,否则其他功能将无法工作,但该模型确实包含一个“公共列表 Movies { get ; 设置; }" 行
    【解决方案2】:

    添加属性 public decimal Price { get;放; } 在您的类 MovieGenreViewModel 中并将您的最高价格更改为

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

    【讨论】:

      【解决方案3】:

      在视图中绑定List集合的一般方法就像@ekke说的一样,全部在循环中然后使用@Model.Movies[i].Price这样绑定。但是在循环中会造成多个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>
      

      结果:

      【讨论】:

      • 如果我的回答对你有用,可以标记为答案,对以后遇到同样问题的人有帮助。
      猜你喜欢
      • 2019-05-09
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      相关资源
      最近更新 更多