【问题标题】:Issue with SelectList - NullReferenceExceptionSelectList 的问题 - NullReferenceException
【发布时间】:2021-07-22 16:06:04
【问题描述】:

在为 chinook 数据库创建曲目时,我设置了一个 SelectList 来选择专辑。按照 Microsoft 文档的说明,出于某种原因(我看不到,因为我仍在努力学习),它不喜欢我在剃刀页面上的视图。演练的代码如下。

实体:

public class Album
{        
    public int AlbumId { get; set; }
    public string Title { get; set; }
    public int ArtistId { get; set; }

    //related entities
    public virtual ICollection<Track> Tracks { get; set; }
    public virtual Artist Artist { get; set; }

}

public class Track
{
    public int TrackId { get; set; }
    public string Name { get; set; }
    public int AlbumId { get; set; }
    public string Composer { get; set; }
    public int Milliseconds { get; set; }
    public int Bytes { get; set; }
    public double UnitPrice { get; set; }
    public int MediaTypeId { get; set; }
    public int GenreId { get; set; }

    //related entities

    public virtual Album Album { get; set; }

}

为 SelectedList 创建模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using UWS.Project;

namespace Project.Pages.Albums
{
     public class AlbumPageModel : PageModel
     { 
        public SelectList AlbumNameSL { get; set; }

        public void PopulateAlbumsDropDownList(Chinook db,
        object selectedAlbum = null)
        {
           var albumsQuery = from a in db.Albums
                                  orderby a.Title // Sort by name.
                                  select a;

           AlbumNameSL = new SelectList(albumsQuery,
                       "AlbumId", "Title", selectedAlbum);
        }
     }
 }

现在是我创建轨道的模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using UWS.Project;

namespace Project.Pages.Albums
{
    public class TrackCreateModel : AlbumPageModel
    {
        private Chinook db;
        public TrackCreateModel(Chinook injectedContext)
        {
            db = injectedContext;
        }

        public IActionResult OnGet(int? id)
        {
            PopulateAlbumsDropDownList(db);
            return Page();
        }

        [BindProperty]
        public Track Track { get; set; }

        public async Task<IActionResult> OnPostAsync()
        {
            var emptyTrack = new Track();

            if (await TryUpdateModelAsync<Track>(
                 emptyTrack,
                "track",   // Prefix for form value.
                 s => s.AlbumId, s => s.Name, s => s.Composer, s => s.Milliseconds, s => s.Bytes, s 
=> s.MediaTypeId, s => s.GenreId, s => s.UnitPrice))
            {
                db.Tracks.Add(emptyTrack);
                await db.SaveChangesAsync();
                return RedirectToPage("./Index");
            }

            // Select AlbumId if TryUpdateModelAsync fails.
            PopulateAlbumsDropDownList(db, emptyTrack.AlbumId);
            return Page();
        }
    }
}

尝试在我看来实现 SelectList:

对此我不熟悉,我一辈子都看不到这个问题。我用 SelectedList 在这里查看了以前的问题,但没有一个与我的问题有关。任何帮助将不胜感激。

【问题讨论】:

  • Track.AlbumId 的类型是什么?可能Track.AlbumId 的类型与选择的值不同,会出现验证错误。

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


【解决方案1】:

不要在AlbumPageModelPopulateAlbumsDropDownList方法中输入selectedValue

目前您要么将其留空,要么提供一个 id,但这无论如何都行不通

【讨论】:

  • 这应该是评论,而不是答案。
  • 由于我的声誉,我还不能发布 cmets。我试着遵守规则,但我应该怎么做呢?
  • 我从 SelectList 参数中注释掉了 selectedAlbum,它现在显示了列表,这是一个很好的进展!现在我遇到了问题,当我选择要添加曲目的专辑时,显示验证错误 - “值 '1' 无效”。我不明白如果我从列表中选择它怎么会无效?
  • 尝试将select 中的asp-for="Track.AlbumId" 更改为asp-for="Track.Album"spanasp-validation-for 相同
  • 它也不喜欢那样——它只是没有创建任何没有 AlbumId 的东西。当 AlbumId 存在时 - 它会创建整个记录,但不会创建 AlbumId。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多