【问题标题】:Cannot get selected value from SelectList Razor Pages无法从 SelectList Razor Pages 中获取选定的值
【发布时间】:2021-07-01 09:25:21
【问题描述】:

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

我遇到的问题是 Razor 页面的 SelectList 没有从列表中绑定选择的 reference 值(即电影对象),但是当我有 @ 987654327@ of Movies 相反,我正确获取了所选值。

这是我的代码:

Details.cshtml

<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>

Details.cshtml.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;
    }

Movie.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;
        }
    }

Genre.cs

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;
    }
}

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

但是,当我有IDs 的SelectList 而不是Movies 时,它可以正常工作:

【问题讨论】:

    标签: c# asp.net-core .net-core razor-pages selectlist


    【解决方案1】:

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

    所以你必须修复 SelectList 代码:

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

    【讨论】:

    • 它也不起作用,奇怪的是post form 发送的是流派的ID,没有任何电影的其他详细信息。跨度>
    • 区分大小写。我不知道您的电影属性名称。尝试使用“ID”以及您在 Moview 中使用的内容,而不是“名称”
    • 我知道我应该把自己的属性放在这里,但正如我所说,当我的SelectList 包含Movies 时,不会返回所选项目,而是只返回@987654326 @ of Genre 这很奇怪,因为它在任何地方都没有请求。
    • 你能发布你的电影课吗?
    • 请不要忘记接受答案。
    【解决方案2】:

    首先,&lt;select&gt;&lt;/select&gt; 只会返回它的选定值,它不能绑定模型。你可以像Sergey 所说的那样使用MoviesSL = new SelectList(Genre.Movies,"ID","Title");。然后你可以将选定的电影ID返回给post handler。然后得到ID 来自 _context 的电影。

    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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      相关资源
      最近更新 更多