无法从 SelectList Razor 页面中获取选定的值

问题描述

我正在使用 Razor Pages 制作一个简单的 MovieApp。我有两个模型:电影 * - 1 流派。我想要的是,当我导航到流派页面并选择特定流派时,我想显示与该流派相关的所有电影的列表,我想能够从流派中选择并导航电影

我遇到的问题是 Razor Pages 的 SelectList 不是从列表中绑定选定的 reference 值(即电影的对象),但是当我有 { {1}} 个电影,而我正确地获得了选定的值。

这是我的代码

Details.cshtml

IDs

Details.cshtml.cs

<div>
<h4>Genre</h4>
<hr />
<form method="post">
    <dl class="row">
        <dt class="col-sm-2">
            @Html.displayNameFor(model => model.Genre.GenreTitle)
        </dt>
        <dd class="col-sm-10">
            @Html.displayFor(model => model.Genre.GenreTitle)
        </dd>
    </dl>
    <div class="form-group" style="width: 250px;">
        <label asp-for="MoviesSL" class="control-label"></label>
        <select asp-for="SelectedMovie" class="form-control"
                asp-items="Model.MoviesSL">
        </select>
    </div>
    <span asp-validation-for="SelectedMovie.ID" class="text-danger"></span>
    <div>
        <input type="submit" value="Navigate" class="btn btn-info" />
    </div>
</form>

Movie.cs

    public Genre Genre { get; set; }
    [display(Name = "Movies list")]
    public SelectList MoviesSL { get; set; }
    private Movie selectedMovie;
    [BindProperty]
    public Movie SelectedMovie 
    {
        get => selectedMovie;
        set
        {
            selectedMovie = value;
            //int g = 0;
        }
    }

    public async Task<IActionResult> OnGetAsync(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        Genre = await _context.Genre.Include(m => m.Movies).FirstOrDefaultAsync(m => m.GenreId == id);
        MoviesSL = new SelectList(Genre.Movies);

        //int g = 0;

        if (Genre == null)
        {
            return NotFound();
        }
        return Page();
    }

    public void OnPost()
    {
        var k = SelectedMovie;

        //int g = 0;
    }

流派.cs

public class Movie
    {
        [Key]
        public int ID { get; set; }

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

        [DataType(DataType.Date)]
        [display(Name = "Release Date")]
        [displayFormat(DataFormatString = "{0:dd-MM-yyyy}",ApplyFormatInEditMode = true)]
        public DateTime ReleaseDate { get; set; }

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

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

        public int GenreId { get; set; }
        public Genre Genre { get; set; }

        public override string ToString()
        {
            return Title;
        }
    }

当我从列表中选择一部电影并尝试通过 post 方法“导航”时,我得到一个空的 Movie 对象。

When I select a movie from the list,I get an empty Movie object

但是,当我有 public class Genre { public Genre() { Movies = new List<Movie>(); } [Key] public int GenreId { get; set; } [required] [StringLength(30,MinimumLength = 5)] [display(Name = "Genre Title")] [RegularExpression(@"^[A-Z]+[a-zA-Z]*$")] public string GenreTitle { get; set; } [display(Name = "Number of movies")] public ICollection<Movie> Movies { get; set; } public override string ToString() { return GenreTitle; } } SelectList 而不是 IDs 时,它可以正常工作:

Working correctly

解决方法

要启动 SelectList,您需要 3 个属性:项目列表、可用作 SelectList 值的项目的属性名称以及可用于显示 SelectList 的名称。

所以你必须修复 SelectList 代码:

 MoviesSL = new  SelectList(Genre.Movies,"ID","Title");
,

首先,<select></select> 只会返回它被选中的值,它不能绑定模型。你可以像MoviesSL = new SelectList(Genre.Movies,"Title"); 所说的那样使用 Sergey。然后你可以将电影的选中 ID 返回给发布处理程序。然后从_context 中获取带有ID 的电影。

1.删除

<span asp-validation-for="SelectedMovie.ID" class="text-danger"></span>

2.改变

[BindProperty]
    public Movie SelectedMovie 
    {
        get => selectedMovie;
        set
        {
            selectedMovie = value;
            //int g = 0;
        }
    }

[BindProperty]
        public int SelectedMovie { get; set; }

3.改变

public void OnPost()
    {
        var k = SelectedMovie;

        //int g = 0;
    }

public void OnPost()
    {
        Movie k = _context.Movie.Where(m=>m.ID== SelectedMovie).FirstOrDefault();

        //int g = 0;
    }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...